吴忠躺衫网络科技有限公司

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

嵌入式開發(fā)愛好者 ? 來源:嵌入式開發(fā)愛好者 ? 作者:嵌入式開發(fā)愛好者 ? 2022-11-30 09:58 ? 次閱讀

第一:C語言板控制LED燈簡介

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

1、匯編文件

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

2、C語言文件

C語言文件就是完成我們的業(yè)務層代碼的,其實就是我們實際要完成的功能。其實STM32也是這樣的,只是我們在開發(fā)STM32的時候沒有想到這一點,以STM32中啟動文件startup_stm32f10x_hd.s這個匯編文件就是完成C語言環(huán)境搭建的,當然還有一些其他處理,比如中斷向量表等。

第二:實驗程序實現(xiàn)

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

 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

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

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

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

第三:C語言實驗控制程序

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

#ifndef __MAIN_H
#define __MAIN_H
//CCM相關寄存器地址
#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)
//相關寄存器地址
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
//GPIO1相關寄存器地址
 #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,這個很簡單,很好理解。main.c函數(shù)的具體實現(xiàn)。

#include"main.h"
//使能外設的所有時鐘
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對應的GPIO時鐘
void led_init(void)
{
/* 1、初始化 IO 復用, 復用為 GPIO1_IO03 */
     SW_MUX_GPIO1_IO03 = 0x5;
     
//配置GPIO1_IO03屬性
  SW_PAD_GPIO1_IO03 = 0X10B0;
  
//初始化GPIO,GPIO_IO03設置為輸出
GPIO1_GDIR=0X0000008;

//設置GPIO1_IO03輸出低電平,打開LED0
GPIO1_DR=0x0;
}

//打開對應的LED燈
void led_on(void)
{
  //將GPIO1_DR 的 bit3 清零 
  GPIO1_DR &= ~(1<<3);
}

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

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

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

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


    return0;
}

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

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

審核編輯:郭婷


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

    關注

    242

    文章

    23355

    瀏覽量

    663169
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210386
  • 函數(shù)
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62968

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

文章出處:【微信號:嵌入式開發(fā)愛好者,微信公眾號:嵌入式開發(fā)愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    貼片NTC熱敏電阻在LED照明中的應用

    ,因此需要進行有效的溫度控制,來保持LED的亮度穩(wěn)定且壽命持久。解決辦法是將貼片NTC熱敏電阻嵌入電路,與LED進行熱耦合,利用NTC電阻
    的頭像 發(fā)表于 12-29 09:34 ?237次閱讀
    貼片NTC熱敏電阻在<b class='flag-5'>LED</b>照明中的應用

    擎耀解碼智能汽車可替換LED前照控制運行組成原理方案

    智能汽車可替換LED前照控制運行的原理涉及多個方面,包括自適應前照系統(tǒng)(AFS)的工作原理、傳感器的應用、步進電機的控制以及模糊
    的頭像 發(fā)表于 12-10 16:04 ?221次閱讀

    使用C語言實現(xiàn)函數(shù)模板

      用C語言能不能實現(xiàn)一個通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?477次閱讀

    呼吸的概念和實現(xiàn)原理

    呼吸在日常生活中經常見到,如電子時鐘,小夜燈等等,本文我們介紹下通過PWM波來控制LED實現(xiàn)呼吸
    的頭像 發(fā)表于 10-24 14:50 ?2076次閱讀
    呼吸<b class='flag-5'>燈</b>的概念和<b class='flag-5'>實現(xiàn)</b>原理

    霍爾開關在魚缸LED中的應用

    水溫。 你知道嗎?霍爾開關在魚缸LED中起著關鍵性作用,霍爾開關是如何應用于LED板中的呢? 在魚缸LED
    的頭像 發(fā)表于 10-09 09:59 ?293次閱讀

    COB光源與LED珠的區(qū)別

    的發(fā)光二極管。 光輸出: COB珠: 由于多個LED芯片集成在一個區(qū)域,COB珠通常提供更均勻的光輸出,因為光源更為集中。 LED
    的頭像 發(fā)表于 09-19 09:33 ?5571次閱讀

    LED高精密板:卓越照明

    相關的內容,一起看看吧~ LED 高精密板是由多個 LED 芯片組成的陣列,每個 LED 芯片都能獨立發(fā)光。通過控制
    的頭像 發(fā)表于 08-08 11:42 ?358次閱讀

    PLC編程語言C語言的區(qū)別

    在工業(yè)自動化和計算機編程領域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們在多個方面存在顯
    的頭像 發(fā)表于 06-14 17:11 ?3230次閱讀

    使用C語言實現(xiàn)的CRC計算單元的例子

    使用C語言實現(xiàn)的CRC計算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?1072次閱讀

    光照LED控制蘑菇栽培

    ,蘑菇在衛(wèi)生控制設施中生長,以防止有害細菌的影響。蘑菇屬于真菌,不會進行光合作用,因為紫外線會抑制菌絲體的生長。栽培期間在光線照射有限的暗室中進行,在子實體發(fā)育生長階段,常用熒光作為光源來控制光照。 盡管蘑菇不進行光合作用,但
    的頭像 發(fā)表于 05-11 11:17 ?474次閱讀

    請問STM32L4如何利用STM32CubeMX實現(xiàn)EXTI控制LED?

    STM32L4利用STM32CubeMX如何實現(xiàn)EXTI控制LED?
    發(fā)表于 04-09 08:07

    C語言實現(xiàn)Web參數(shù)傳遞

    電子發(fā)燒友網站提供《C語言實現(xiàn)Web參數(shù)傳遞.docx》資料免費下載
    發(fā)表于 03-24 09:14 ?2次下載

    LED條的分類

    為一體驅動板(板只有LED光源,就沒有任何電子元器件)。②:精密電子元器件恒流驅動就是板+恒流IC+LED光源為一體。③:CV=恒壓
    的頭像 發(fā)表于 02-27 20:13 ?1790次閱讀
    <b class='flag-5'>LED</b><b class='flag-5'>燈</b>條的分類

    led的優(yōu)點和缺點有哪些 led相比于其它的優(yōu)勢在哪里

    LED的優(yōu)點主要包括高效節(jié)能、長壽命、環(huán)保、調光范圍廣、安全可靠、色彩豐富多樣等方面。然而,與之相對應的缺點是價格較高、光束角度較窄、色溫不穩(wěn)定等。下面將詳細介紹LED的優(yōu)點和缺點
    的頭像 發(fā)表于 02-20 13:41 ?9161次閱讀

    全光譜和普通led的區(qū)別

    全光譜和普通led的區(qū)別? 全光譜和普通LED是目前市場上常見的兩種照明產品,它們在使用
    的頭像 發(fā)表于 02-18 18:07 ?9049次閱讀
    百家乐官网英皇娱乐城| 百家乐官网视频双扣下载| 海港城百家乐的玩法技巧和规则 | 精通百家乐官网的玩法技巧和规则| 24山入门| 百家乐有几种玩法| 国际娱百家乐的玩法技巧和规则| 大发888大发888娱乐游戏| 乌鲁木齐县| 真钱百家乐官网公司哪个好| 郑州百家乐官网的玩法技巧和规则 | 百家乐官网赢钱海立方| 试玩百家乐官网代理| 百家乐官网扎金花现金| 百家乐官网园云鼎赌场娱乐网规则 | 老虎机单机游戏下载| 八大胜投注,| 百家乐官网庄比闲多多少| 网络百家乐官网的玩法技巧和规则| 皇室百家乐娱乐城| 百家乐画面| 至尊国际娱乐| 澳门百家乐官网真人斗地主| 百家乐玩法教材| 杭州太阳城假日酒店| 鸡东县| 百家乐官网投注必胜法| 百家乐官网真人现场| 菲彩百家乐的玩法技巧和规则| 总统娱乐城| 中国百家乐官网软件| 金域百家乐的玩法技巧和规则| 金狮娱乐| 百家乐官网游戏卡通| 马洪刚百家乐技巧| 澳门赌场攻略| 五张百家乐官网的玩法技巧和规则| 百家乐百姓话题| 皇城百家乐娱乐城| 百家乐官网娱乐城公司| 百家乐下注稳赢法|