91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用C語(yǔ)言控制LED燈的實(shí)現(xiàn)

嵌入式開(kāi)發(fā)愛(ài)好者 ? 來(lái)源:嵌入式開(kāi)發(fā)愛(ài)好者 ? 作者:嵌入式開(kāi)發(fā)愛(ài)好者 ? 2022-11-30 09:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

第一:C語(yǔ)言板控制LED燈簡(jiǎn)介

實(shí)際工作中很少會(huì)使用到匯編去編寫(xiě)嵌入式驅(qū)動(dòng),畢竟匯編太難,寫(xiě)出來(lái)也不好理解,大部分情況下都使用C語(yǔ)言去編寫(xiě)。只是在開(kāi)始部分用匯編初始化一下C語(yǔ)言環(huán)境,比如初始化DDR、設(shè)置堆棧指針SP等。當(dāng)這些工作都做完以后就可以進(jìn)入C語(yǔ)言環(huán)境,也就是運(yùn)行C語(yǔ)言代碼,一般都是進(jìn)入main函數(shù)。所以都是進(jìn)入main函數(shù),有兩部分文件要做:

1、匯編文件

匯編文件只是用來(lái)完成C語(yǔ)言環(huán)境搭建的。

2、C語(yǔ)言文件

C語(yǔ)言文件就是完成我們的業(yè)務(wù)層代碼的,其實(shí)就是我們實(shí)際要完成的功能。其實(shí)STM32也是這樣的,只是我們?cè)陂_(kāi)發(fā)STM32的時(shí)候沒(méi)有想到這一點(diǎn),以STM32中啟動(dòng)文件startup_stm32f10x_hd.s這個(gè)匯編文件就是完成C語(yǔ)言環(huán)境搭建的,當(dāng)然還有一些其他處理,比如中斷向量表等。

第二:實(shí)驗(yàn)程序?qū)崿F(xiàn)

在STM32中,啟動(dòng)文件startup_hd.s就是完成C語(yǔ)言環(huán)境搭建的,當(dāng)然還有一些其他的處理。

 Stack_Size EQU 0x00000400
                 AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
 __initial_sp
;HeapConfiguration
;HeapSize(inBytes)<0x0-0xFFFFFFFF:8>
;


Heap_SizeEQU0x00000200


  AREAHEAP,NOINIT,READWRITE,ALIGN=3
  __heap_base
  Heap_MemSPACEHeap_Size
__heap_limit
//省略掉部分代碼
Reset_Handler PROC
    EXPORT Reset_Handler [WEAK]
  IMPORT__main
   IMPORTSystemInit
   LDRR0,=SystemInit
   BLXR0
   LDRR0,=__main
BXR0
ENDP

代碼分析:設(shè)置棧的大小,這里設(shè)置為0X400=1024字節(jié)。下面遇到的__initial_sp就是初始化SP指針。設(shè)置堆的大小,復(fù)位中斷服務(wù)函數(shù),STM32復(fù)位完成以后會(huì)執(zhí)行中斷服務(wù)函數(shù)。調(diào)用SystemInit()函數(shù)來(lái)完成其他初始化工作,會(huì)調(diào)用__main是庫(kù)函數(shù)實(shí)現(xiàn)。

.global _start /* 全局標(biāo)號(hào) */
_start:
/* 進(jìn)入 SVC 模式 */
mrsr0,cpsr
bicr0,r0,#0x1f/*將r0的低5位清零,也就是cpsr的M0~M4*/
orrr0,r0,#0x13/*r0或上0x13,表示使用SVC模式*/
msrcpsr,r0//將r0的數(shù)據(jù)寫(xiě)入到cpsr_c中
ldr sp, =0X80200000 /* 設(shè)置棧指針 */
bmain/*跳轉(zhuǎn)到main函數(shù)*/

這里我們可以設(shè)置處理器運(yùn)行于SVC模式下,處理器模式的設(shè)置是通過(guò)修改CPSR程序狀態(tài)寄存器來(lái)完成的。上面編寫(xiě)的start.s文件中卻沒(méi)有初始化DDR3的代碼,但是卻將SVC模式下的SP指針設(shè)置到了DDR3的地址范圍中,這不會(huì)出問(wèn)題嗎?肯定不會(huì)的,DDR3肯定還是要初始化的,DCD數(shù)據(jù)包含了DDR配置參數(shù),內(nèi)部的Boot ROM會(huì)讀取DCD數(shù)據(jù)中的參數(shù)完成DDR初始化的。

第三:C語(yǔ)言實(shí)驗(yàn)控制程序

C語(yǔ)言部分有兩個(gè)文件件 main.c 和 main.h,main.h 里面主要是定義的寄存器地址,在 main.h里面輸入代碼:

#ifndef __MAIN_H
#define __MAIN_H
//CCM相關(guān)寄存器地址
#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
#defineCCM_CCGR2*((volatileunsignedint*)0X020C4070)
#defineCCM_CCGR3*((volatileunsignedint*)0X020C4074)
#defineCCM_CCGR4*((volatileunsignedint*)0X020C4078)
#defineCCM_CCGR5*((volatileunsignedint*)0X020C407C)
#defineCCM_CCGR6*((volatileunsignedint*)0X020C4080)
//相關(guān)寄存器地址
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
//GPIO1相關(guān)寄存器地址
 #define GPIO1_DR *((volatile unsigned int *)0X0209C000)
 #define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
 #define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
#defineGPIO1_ICR1*((volatileunsignedint*)0X0209C00C)
#defineGPIO1_ICR2*((volatileunsignedint*)0X0209C010)
#defineGPIO1_IMR*((volatileunsignedint*)0X0209C014)
#defineGPIO1_ISR*((volatileunsignedint*)0X0209C018)
#defineGPIO1_EDGE_SEL*((volatileunsignedint*)0X0209C01C)


#endif

在main.h中以宏定義的形式定義要使用到所有的寄存器,后面的數(shù)字就是其地址信息,比如CCM_CCGR0 寄存器的地址就是 0X020C4068,這個(gè)很簡(jiǎn)單,很好理解。main.c函數(shù)的具體實(shí)現(xiàn)。

#include"main.h"
//使能外設(shè)的所有時(shí)鐘
void clk_enable(void)
{
CCM_CCGR0=0xffffffff;
CCM_CCGR1=0xffffffff;
CCM_CCGR2=0xffffffff;
CCM_CCGR3=0xffffffff;
CCM_CCGR4=0xffffffff;
CCM_CCGR5=0xffffffff;
CCM_CCGR6=0xffffffff;
}

//初始化LED對(duì)應(yīng)的GPIO時(shí)鐘
void led_init(void)
{
/* 1、初始化 IO 復(fù)用, 復(fù)用為 GPIO1_IO03 */
     SW_MUX_GPIO1_IO03 = 0x5;
     
//配置GPIO1_IO03屬性
  SW_PAD_GPIO1_IO03 = 0X10B0;
  
//初始化GPIO,GPIO_IO03設(shè)置為輸出
GPIO1_GDIR=0X0000008;

//設(shè)置GPIO1_IO03輸出低電平,打開(kāi)LED0
GPIO1_DR=0x0;
}

//打開(kāi)對(duì)應(yīng)的LED燈
void led_on(void)
{
  //將GPIO1_DR 的 bit3 清零 
  GPIO1_DR &= ~(1<<3);
}

//關(guān)閉LED燈
void led_off(void)
{
    GPIO1_DR |= (1<<3);
}

//短暫的延時(shí)函數(shù)
void delay_short(volatile unsigned int n)
{
while(--){}
}

//延時(shí)大約1ms的函數(shù)
void delay(volatile unsigned int n)
{
    while(n--)
    {
delay_short(0x7ff);
    }
}

int main(void)
{
    clk_enable(); /* 使能所有的時(shí)鐘 */
    led_init();/*初始化led*/
    
    while(1)/*死循環(huán)*/
{
   led_off();/*關(guān)閉LED*/
   delay(500);/*延時(shí)大約500ms*/
  
   led_on();/*打開(kāi)LED*/
   delay(500);/*延時(shí)大約500ms*/
}


    return0;
}

利用Makefile文件可以進(jìn)行編譯,將對(duì)應(yīng)的可執(zhí)行文件,放到開(kāi)發(fā)板上,可以看到LED大概500ms閃爍一次。

總結(jié):利用C語(yǔ)言實(shí)現(xiàn)底層驅(qū)動(dòng)的控制,要注意可執(zhí)行程序放的位置,以及如何鏈接編譯等。

審核編輯:郭婷


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    243

    文章

    24592

    瀏覽量

    690745
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    218996
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67494

原文標(biāo)題:Linux系統(tǒng)中利用C語(yǔ)言控制LED燈的實(shí)現(xiàn)

文章出處:【微信號(hào):嵌入式開(kāi)發(fā)愛(ài)好者,微信公眾號(hào):嵌入式開(kāi)發(fā)愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    汽車(chē)高壓HB LED控制器MAX25611B:設(shè)計(jì)與應(yīng)用全解析

    汽車(chē)高壓HB LED控制器MAX25611A/B/C/D:設(shè)計(jì)與應(yīng)用全解析 在汽車(chē)照明領(lǐng)域,LED以其高效、節(jié)能、壽命長(zhǎng)等優(yōu)勢(shì),成為了汽車(chē)前照
    的頭像 發(fā)表于 01-30 16:45 ?515次閱讀

    汽車(chē)高壓HB LED控制器MAX25611C:性能剖析與設(shè)計(jì)指南

    汽車(chē)高壓HB LED控制器MAX25611A/B/C/D:性能剖析與設(shè)計(jì)指南 作為電子工程師,在汽車(chē)照明領(lǐng)域的設(shè)計(jì)中,選擇合適的LED控制
    的頭像 發(fā)表于 01-30 16:45 ?498次閱讀

    講解C語(yǔ)言代碼的實(shí)現(xiàn)過(guò)程

    重點(diǎn)講解C語(yǔ)言代碼的實(shí)現(xiàn)過(guò)程,算法的C語(yǔ)言實(shí)現(xiàn)過(guò)程具有一般性,通過(guò)PID算法的C
    發(fā)表于 01-21 07:58

    PWM經(jīng)典應(yīng)用:LED亮度控制及呼吸實(shí)戰(zhàn)

    信號(hào)生成: 加熱控制: 本文特別分享PWM相關(guān)基礎(chǔ)知識(shí),并以Air8000核心板為例,演示LuatOS開(kāi)發(fā)中如何使用PWM功能實(shí)現(xiàn)LED亮度控制及呼吸
    的頭像 發(fā)表于 01-05 20:50 ?242次閱讀
    PWM經(jīng)典應(yīng)用:<b class='flag-5'>LED</b>亮度<b class='flag-5'>控制</b>及呼吸<b class='flag-5'>燈</b>實(shí)戰(zhàn)

    C語(yǔ)言主要特點(diǎn)

    指針類(lèi)型數(shù)據(jù),使用十分靈活和多樣化,能用來(lái)實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(如鏈表、樹(shù)、棧等)的運(yùn)算。 4.具有結(jié)構(gòu)化的控制語(yǔ)句。用函數(shù)作為程序的模塊單位,便于實(shí)現(xiàn)程序的模塊化。C
    發(fā)表于 01-05 07:41

    基于PWM的LED調(diào)光技術(shù)與呼吸實(shí)現(xiàn)方法!

    利用PWM技術(shù)控制LED亮度,不僅效率高、響應(yīng)快,還能實(shí)現(xiàn)細(xì)膩的視覺(jué)過(guò)渡。系統(tǒng)介紹PWM的工作機(jī)制,結(jié)合具體硬件平臺(tái),展示如何編程實(shí)現(xiàn)
    的頭像 發(fā)表于 12-15 13:03 ?427次閱讀
    基于PWM的<b class='flag-5'>LED</b>調(diào)光技術(shù)與呼吸<b class='flag-5'>燈</b><b class='flag-5'>實(shí)現(xiàn)</b>方法!

    LED觸摸控制PCBA方案開(kāi)發(fā) | 控觸摸方案開(kāi)發(fā)

    單鍵LED觸摸控制PCBA方案開(kāi)發(fā)控觸摸方案開(kāi)發(fā)PCBA方案控方案支持定制尋找靈活、可靠的LED燈光
    的頭像 發(fā)表于 12-10 17:43 ?368次閱讀
    <b class='flag-5'>LED</b>觸摸<b class='flag-5'>控制</b>PCBA方案開(kāi)發(fā) | <b class='flag-5'>燈</b>控觸摸方案開(kāi)發(fā)

    C語(yǔ)言特性

    的執(zhí)行效率和資源利用率有著嚴(yán)苛的要求。C 語(yǔ)言生成的代碼簡(jiǎn)潔緊湊,能夠在有限的硬件條件下快速運(yùn)行,滿(mǎn)足嵌入式系統(tǒng)對(duì)性能的高要求。例如,在智能家居設(shè)備的控制芯片中,
    發(fā)表于 11-24 07:01

    C語(yǔ)言在嵌入式開(kāi)發(fā)中的應(yīng)用

    穩(wěn)定性控制系統(tǒng)(VSC)等關(guān)鍵部件的開(kāi)發(fā),C 語(yǔ)言都發(fā)揮著至關(guān)重要的作用。 以工業(yè)自動(dòng)化生產(chǎn)線(xiàn)中的運(yùn)動(dòng)控制系統(tǒng)為例,C
    發(fā)表于 11-21 08:09

    LuatOS中PWM實(shí)現(xiàn)LED亮度調(diào)節(jié)與呼吸的實(shí)戰(zhàn)教程

    PWM在LED亮度調(diào)節(jié)和呼吸效果實(shí)現(xiàn)方面有著廣泛應(yīng)用。在LuatOS環(huán)境中,如何高效運(yùn)用PWM功能是開(kāi)發(fā)者需要掌握的關(guān)鍵。本實(shí)戰(zhàn)教程將通過(guò)具體案例,引導(dǎo)開(kāi)發(fā)者快速上手,輕松實(shí)現(xiàn)
    的頭像 發(fā)表于 11-11 19:05 ?8477次閱讀
    LuatOS中PWM<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>LED</b>亮度調(diào)節(jié)與呼吸<b class='flag-5'>燈</b>的實(shí)戰(zhàn)教程

    2.4 A 三通道閃光 LED 驅(qū)動(dòng)器,帶 I<sup>2</sup>C 控制接口 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()2.4 A 三通道閃光 LED 驅(qū)動(dòng)器,帶 I2C 控制接口相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有2.4 A 三通道閃光
    發(fā)表于 07-30 18:30
    2.4 A 三通道閃光<b class='flag-5'>燈</b> <b class='flag-5'>LED</b> 驅(qū)動(dòng)器,帶 I<sup>2</sup><b class='flag-5'>C</b> <b class='flag-5'>控制</b>接口 skyworksinc

    LED植物生長(zhǎng)的原理是什么

    LED植物生長(zhǎng)基于植物光合作用對(duì)特定光譜的需求,通過(guò)人工光源精準(zhǔn)調(diào)控光質(zhì)、光強(qiáng)和光周期,優(yōu)化植物生長(zhǎng)。其核心原理是利用LED芯片對(duì)光譜進(jìn)行精確匹配,光強(qiáng)與光周期可控,適應(yīng)不同應(yīng)用場(chǎng)景
    的頭像 發(fā)表于 06-30 17:23 ?1732次閱讀
    <b class='flag-5'>LED</b>植物生長(zhǎng)<b class='flag-5'>燈</b>的原理是什么

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循環(huán)控制
    的頭像 發(fā)表于 04-29 18:49 ?2033次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)<b class='flag-5'>控制</b>

    使用單片機(jī)驅(qū)動(dòng)多組LED實(shí)現(xiàn)呼吸效果電路

    各位大佬,請(qǐng)教下,當(dāng)前我需要使用單片機(jī)驅(qū)動(dòng)控制20路并聯(lián)LED,需要PWM驅(qū)動(dòng)實(shí)現(xiàn)呼吸的效果,目前我是直接使用三極管驅(qū)動(dòng),這種電路會(huì)有什
    發(fā)表于 04-11 14:24

    S32G2如何利用C語(yǔ)言開(kāi)發(fā)IPCF?

    S32G2 應(yīng)該如何利用 C語(yǔ)言在 A 核上開(kāi)發(fā) IPCF 程序,是否有相關(guān)的 SDK 可用?或者我需要將 ipc-shm 等封裝到一個(gè) C 庫(kù)中,有沒(méi)有相關(guān)的文檔或示例?
    發(fā)表于 03-27 06:49