【STM32】LED初始化基础以及基本使用方法(CT117E电路)
目錄
LED的使用
LED燈的初始化
LED燈的控制(寄存器or庫函數)
參考?
LED的使用
LED燈的初始化
void LED_INIT(void) {// 初始化結構體GPIO_InitTypeDef GPIO_InitStructure;// 使能我們的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);// LED配置引腳初始化參數GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; // 0xff00GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// LED初始化引腳GPIO_Init(GPIOC, &GPIO_InitStructure);// 鎖存器配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 鎖存器初始化引腳GPIO_Init(GPIOD, &GPIO_InitStructure);// 將LED初始化為熄滅GPIOD->ODR |= (1<<2); // Pin_2GPIOC->ODR = 0XFF00;GPIOD->ODR &= ~(1<<2); // 0X0010 -> 0X1101 的轉變 }stm32的每一個引腳都有時鐘控制,這樣在不用的時候可以關閉時鐘來達到節能的目的,所以,如果要使用外設,必須先打開時鐘,否則沒有辦法進行操作
既要利用RCC_APB2PeriphClockCmd函數使能對應的時鐘
以上代碼首先要定義GPIO初始化結構體,通過對CT117E原理圖的分析可以看到控制LED燈的鎖存器引腳"N_LE"與"H_D0"到"H_D7"分別涉及到了GPIOD和GPIOC,所以用以下代碼對兩個GPIO進行使能。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);選擇對應的引腳進行配置,比如從電路圖可以看到要配置LED1到LED3,則需要配置引腳8到9。
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10?
?GPIO 引腳速度: GPIO_Speed_2MHz ??? (10MHz, 50MHz) ;
又稱輸出驅動電路的響應速度:(芯片內部在I/O口的輸出部分安排了多個響應速度不同的輸出驅動電路,用戶可以根據自己的需要選擇合適的驅動電路,通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的噪聲控制和降低功耗的目的。)
可理解為:?輸出驅動電路的帶寬:即一個驅動電路可以不失真地通過信號的最大頻率。(如果一個信號的頻率超過了驅動電路的響應速度,就有可能信號失真。失真因素?)如果信號頻率為10MHz,而你配置了2MHz的帶寬,則10MHz的方波很可能就變成了正弦波。就好比是公路的設計時速,汽車速度低于設計時速時,可以平穩地運行,如果超過設計時速就會顛簸,甚至翻車。
?這里一般設置最快的響應速度
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;關于模式這里可以了解推免輸出的模式:https://zhidao.baidu.com/question/1925251871090147787.html
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推免輸出模式然后初始化GOPOC口的對應引腳,既對C口用初始化結構體來初始化
GPIO_Init(GPIOC, &GPIO_InitStructure);?"N_LE"是LED燈的使能引腳,需要找對應的引腳進行單獨的初始化,其方式與上面相似,只需改變初始化結構體"GPIO_InitStructure"的參數并對其進行初始化即可
// 鎖存器配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 鎖存器初始化引腳GPIO_Init(GPIOD, &GPIO_InitStructure);LED燈的控制(寄存器or庫函數)
?注意初始化LED燈之后,需要對引腳GPIO_Pin8到15全部置0,就是說要先將所有的燈都關閉。
不僅是初始化對應GPIO口的引腳之后要置0,在每次使用LED燈之前也要先全部置0后再對LED燈進行使用
利用寄存器操作時,可以對結構體GPIO的ODR進行位操作,位操作的方式與各個方式的優缺點可以參考該博文:https://blog.csdn.net/byhunpo/article/details/88996657
//寄存器操作:GPIOD->ODR |= (1<<2); // Pin_2 在原來值的基礎之上與(0x...00100)進行或操作GPIOC->ODR = 0XFF00;GPIOD->ODR &= ~(1<<2); // 0X...00100 -> 0X...1101 的轉變 //庫函數操作:GPIO_SetBits(GPIOD,GPIO_Pin_2); //對應的GPIO口的對應引腳置高電平GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11\|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);GPIO_ResetBits(GPIOD,GPIO_Pin_2);//對應的GPIO口的對應引腳置低電平使用或者說控制LED燈時,用上面相同方法(寄存器的方法或者庫函數的方法)對LED燈進行操作即可。
下面是LED所對應的引腳值:
#define LED1 ((uint16_t)0x0100) /*!< Pin 8 selected */ #define LED2 ((uint16_t)0x0200) /*!< Pin 9 selected */ #define LED3 ((uint16_t)0x0400) /*!< Pin 10 selected */ #define LED4 ((uint16_t)0x0800) /*!< Pin 11 selected */ #define LED5 ((uint16_t)0x1000) /*!< Pin 12 selected */ #define LED6 ((uint16_t)0x2000) /*!< Pin 13 selected */ #define LED7 ((uint16_t)0x4000) /*!< Pin 14 selected */ #define LED8 ((uint16_t)0x8000) /*!< Pin 15 selected */下面是LED的控制函數:?
void LEDControl(u16 LEDx,u8 state) {if(state){GPIO_SetBits(GPIOD,GPIO_Pin_2);GPIO_ResetBits(GPIOC,LEDx);GPIO_ResetBits(GPIOD,GPIO_Pin_2);}else{GPIO_SetBits(GPIOD,GPIO_Pin_2);GPIO_SetBits(GPIOC,LEDx);GPIO_ResetBits(GPIOD,GPIO_Pin_2);} }雖然這里的LEDx是16位的,但是進行位操作時可以用于對32位的值進行操作。
參考?
[1]?stm32引腳速度GPIO_Speed的區別(轉載)?http://blog.sina.com.cn/s/blog_965c4d800102whqu.html
[2]?stm32各種輸出的區別?https://blog.csdn.net/qqGHJ/article/details/88724032
總結
以上是生活随笔為你收集整理的【STM32】LED初始化基础以及基本使用方法(CT117E电路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在旭日X3派开发板上使用Intel Re
- 下一篇: 论文写作的不同阶段,该如何修改?