国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

如何利用C語言控制LED燈的實現

嵌入式開發愛好者 ? 來源:嵌入式開發愛好者 ? 作者:嵌入式開發愛好者 ? 2022-11-30 09:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

1、匯編文件

匯編文件只是用來完成C語言環境搭建的。

2、C語言文件

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

第二:實驗程序實現

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

 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字節。下面遇到的__initial_sp就是初始化SP指針。設置堆的大小,復位中斷服務函數,STM32復位完成以后會執行中斷服務函數。調用SystemInit()函數來完成其他初始化工作,會調用__main是庫函數實現。

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

這里我們可以設置處理器運行于SVC模式下,處理器模式的設置是通過修改CPSR程序狀態寄存器來完成的。上面編寫的start.s文件中卻沒有初始化DDR3的代碼,但是卻將SVC模式下的SP指針設置到了DDR3的地址范圍中,這不會出問題嗎?肯定不會的,DDR3肯定還是要初始化的,DCD數據包含了DDR配置參數,內部的Boot ROM會讀取DCD數據中的參數完成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中以宏定義的形式定義要使用到所有的寄存器,后面的數字就是其地址信息,比如CCM_CCGR0 寄存器的地址就是 0X020C4068,這個很簡單,很好理解。main.c函數的具體實現。

#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);
}

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

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

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


    return0;
}

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

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

審核編輯:郭婷


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

    關注

    243

    文章

    24573

    瀏覽量

    690227
  • Linux
    +關注

    關注

    88

    文章

    11746

    瀏覽量

    218846
  • 函數
    +關注

    關注

    3

    文章

    4416

    瀏覽量

    67378

原文標題:Linux系統中利用C語言控制LED燈的實現

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    汽車高壓HB LED控制器MAX25611B:設計與應用全解析

    汽車高壓HB LED控制器MAX25611A/B/C/D:設計與應用全解析 在汽車照明領域,LED以其高效、節能、壽命長等優勢,成為了汽車前照
    的頭像 發表于 01-30 16:45 ?495次閱讀

    汽車高壓HB LED控制器MAX25611C:性能剖析與設計指南

    汽車高壓HB LED控制器MAX25611A/B/C/D:性能剖析與設計指南 作為電子工程師,在汽車照明領域的設計中,選擇合適的LED控制
    的頭像 發表于 01-30 16:45 ?484次閱讀

    講解C語言代碼的實現過程

    重點講解C語言代碼的實現過程,算法的C語言實現過程具有一般性,通過PID算法的C
    發表于 01-21 07:58

    PWM經典應用:LED亮度控制及呼吸實戰

    信號生成: 加熱控制: 本文特別分享PWM相關基礎知識,并以Air8000核心板為例,演示LuatOS開發中如何使用PWM功能實現LED亮度控制及呼吸
    的頭像 發表于 01-05 20:50 ?207次閱讀
    PWM經典應用:<b class='flag-5'>LED</b>亮度<b class='flag-5'>控制</b>及呼吸<b class='flag-5'>燈</b>實戰

    C語言主要特點

    指針類型數據,使用十分靈活和多樣化,能用來實現各種復雜的數據結構(如鏈表、樹、棧等)的運算。 4.具有結構化的控制語句。用函數作為程序的模塊單位,便于實現程序的模塊化。C
    發表于 01-05 07:41

    基于PWM的LED調光技術與呼吸實現方法!

    利用PWM技術控制LED亮度,不僅效率高、響應快,還能實現細膩的視覺過渡。系統介紹PWM的工作機制,結合具體硬件平臺,展示如何編程實現
    的頭像 發表于 12-15 13:03 ?396次閱讀
    基于PWM的<b class='flag-5'>LED</b>調光技術與呼吸<b class='flag-5'>燈</b><b class='flag-5'>實現</b>方法!

    LED觸摸控制PCBA方案開發 | 控觸摸方案開發

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

    C語言特性

    的執行效率和資源利用率有著嚴苛的要求。C 語言生成的代碼簡潔緊湊,能夠在有限的硬件條件下快速運行,滿足嵌入式系統對性能的高要求。例如,在智能家居設備的控制芯片中,
    發表于 11-24 07:01

    C語言在嵌入式開發中的應用

    穩定性控制系統(VSC)等關鍵部件的開發,C 語言都發揮著至關重要的作用。 以工業自動化生產線中的運動控制系統為例,C
    發表于 11-21 08:09

    LuatOS中PWM實現LED亮度調節與呼吸的實戰教程

    PWM在LED亮度調節和呼吸效果實現方面有著廣泛應用。在LuatOS環境中,如何高效運用PWM功能是開發者需要掌握的關鍵。本實戰教程將通過具體案例,引導開發者快速上手,輕松實現
    的頭像 發表于 11-11 19:05 ?8447次閱讀
    LuatOS中PWM<b class='flag-5'>實現</b><b class='flag-5'>LED</b>亮度調節與呼吸<b class='flag-5'>燈</b>的實戰教程

    2.4 A 三通道閃光 LED 驅動器,帶 I<sup>2</sup>C 控制接口 skyworksinc

    電子發燒友網為你提供()2.4 A 三通道閃光 LED 驅動器,帶 I2C 控制接口相關產品參數、數據手冊,更有2.4 A 三通道閃光
    發表于 07-30 18:30
    2.4 A 三通道閃光<b class='flag-5'>燈</b> <b class='flag-5'>LED</b> 驅動器,帶 I<sup>2</sup><b class='flag-5'>C</b> <b class='flag-5'>控制</b>接口 skyworksinc

    LED植物生長的原理是什么

    LED植物生長基于植物光合作用對特定光譜的需求,通過人工光源精準調控光質、光強和光周期,優化植物生長。其核心原理是利用LED芯片對光譜進行精確匹配,光強與光周期可控,適應不同應用場景
    的頭像 發表于 06-30 17:23 ?1596次閱讀
    <b class='flag-5'>LED</b>植物生長<b class='flag-5'>燈</b>的原理是什么

    深入理解C語言C語言循環控制

    C語言編程中,循環結構是至關重要的,它可以讓程序重復執行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環,C語言提供了多種循環控制
    的頭像 發表于 04-29 18:49 ?1984次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環<b class='flag-5'>控制</b>

    使用單片機驅動多組LED實現呼吸效果電路

    各位大佬,請教下,當前我需要使用單片機驅動控制20路并聯LED,需要PWM驅動實現呼吸的效果,目前我是直接使用三極管驅動,這種電路會有什
    發表于 04-11 14:24

    S32G2如何利用C語言開發IPCF?

    S32G2 應該如何利用 C語言在 A 核上開發 IPCF 程序,是否有相關的 SDK 可用?或者我需要將 ipc-shm 等封裝到一個 C 庫中,有沒有相關的文檔或示例?
    發表于 03-27 06:49