嵌入式學習---STM32實現流水燈以及USART串口通信基於CUBEMX和KEIL
1.下載安裝相關軟件。
在stm32官網下載stm32cubemx安裝包地址如下。
https://www.st.com/en/development-tools/stm32cubemx.html
選擇windows的版本進行下載安裝。
安裝時候不能選擇有中文的路徑存在。(建議可以的話直接全部默認),一直直接點next直到安裝完成。
2.在STM32CubeMX中創建一個項目。
1.打開軟件。在File->New Project中創建一個新的項目。
2.選擇自己的芯片型號,這里我是STM32F103C8
3.配置系統調試接口sys,選擇Serial Wire
4.配置引腳功能在芯片上找到對應的引腳,點擊它,選擇對應的功能。這里先將PC13也就是板載的LED口設置為輸出模式。
在這里可以看到這個口的設置情況。
GPIO output level:有low和high兩種選擇,一般選擇low
GPIO mode:推挽輸出和開漏輸出兩者模式,兩者模式的區別在於推挽輸出中1代表VCC,0表示GND;開漏輸出中1代表高阻態,0代表GND。
GPIO Pull-up/Pull-down:輸入需要上下拉,輸出一般沒有上下拉
Maxinum output speed:最大的輸出速度,一般選擇low就可以了。
5.再點擊project manager界面進行項目的配置。設置項目名字,編譯軟件和相關的固件庫版本。
之后直接點擊右上角GENERATE CODE,生成好之后直接點擊Open Projecet
3.通過C語言以及基於HAL函數庫兩種方式實現流水燈。
再keil中會顯示如上界面讓你選擇設備,選擇自己相應的設備型號即可。
這樣便打開了這個項目。此時編譯一下,設置好燒錄相關的,直接將項目燒入板子中便會發現PC13那個小led會亮起來。
現在只需要再在代碼中加入延時的函數,再多選擇幾個口接上led燈便可以實現流水燈了。
再次打開cubemx打開剛剛的項目,我是將里面的A7,B9,C15三個口設置為輸出模式。
再次生成代碼,再KEIL中打開,keil他會讓你reload這個項目即可在main文件中寫程序代碼。由於cubemx將時鍾和端口輸出方式之類已經配置好了,所以可以直接開始寫代碼了。
以下基於HAL庫實現
void a()
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
}
這樣一個函數便是PC15燈兩,PB9和PA7燈滅的功能。再將另外兩種狀態趙這樣寫上。
再在while函數中實現流水的功能。
while (1)
{
//寫循環執行的代碼
a();
HAL_Delay(1000);
b();
HAL_Delay(1000);
c();
HAL_Delay(1000);
}
將程序燒錄進板子,結果如下所示。
再是通過C語言實現**
通過C語言實現就是像我上一篇博客那樣直接控制寄存器,只不過這次省去了配置時鍾以及輸出設置相關的東西。
通過STM32手冊找到要控制的寄存器的地址,這里就是要將PA7設置為1,也就是將這個寄存器的第七位賦值為1(ps:相關內容可以去查看我的上一篇博客:https://www.cnblogs.com/lwtt/p/15426637.html)
#define GPIOA_ORD \*((unsigned volatile int\*)0x4001080C)*
GPIOA_ORD|=1<<7; //設置初始燈為亮
以此類推增加相關的燈的數量以及自己通過函數設計下延時即可。
//在生成的項目中首先定義以下變量和函數
//--------------APB2使能時鍾寄存器------------------------
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
//-------------------簡單的延時函數-----------------------
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ORD=0x0<<7; //PA7低電平
GPIOB_ORD=0x1<<9; //PB9高電平
GPIOC_ORD=0x1<<15; //PC15高電平
}
void B_LED_LIGHT(){
GPIOA_ORD=0x1<<7; //PA7高電平
GPIOB_ORD=0x0<<9; //PB9低電平
GPIOC_ORD=0x1<<15; //PC15高電平
}
void C_LED_LIGHT(){
GPIOA_ORD=0x1<<7; //PA7高電平
GPIOB_ORD=0x1<<9; //PB9高電平
GPIOC_ORD=0x0<<15; //PC15低電平
}
//------------------------在生成的代碼的主函數中加入以下--------------------------
while(j)
{
A_LED_LIGHT();
Delay_ms(10000000);
B_LED_LIGHT();
Delay_ms(10000000);
C_LED_LIGHT();
Delay_ms(10000000);
}
----------------------------------------------------------------------------------
實驗效果也如上面那個GIF所示。
4.通過Keil的軟件仿真邏輯分析儀功能觀察管腳的時序波形
1.在編譯調試的設置之中對下面參數如下設定。
2.選擇邏輯分析儀。
3.在setup中設置需要觀察的端口。
4.點擊右上角后輸入你所要觀察的引腳。例如這里我要觀察的是PB9,輸入GPIOB_IDR.9回車即可。
5.要將輸出的波形設置為bit便於觀察。
6.再關掉這個窗口,點擊run便可以再界面里看到信號的波形結果。
5.完成一個STM32的USART串口通訊程序
1.USART簡介
通用同步異步收發器(Universal Synchronous Asynchronous Receiver and Transmitter)是一個串行通信設備,可以靈活地與外部設備進行全雙工數據交換。有別於 USART 還有一個
UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鍾輸出,我們平時用的串口通信基本都是 UART。
串行通信一般是以幀格式傳輸數據,即是一幀一幀的傳輸,每幀包含有起始信號、數
據信息、停止信息,可能還有校驗信息。USART 就是對這些傳輸參數有具體規定,當然也
不是只有唯一一個參數值,很多參數值都可以自定義設置,只是增強它的兼容性。
2.安裝CH34_Install_Windows_v3_4驅動。
3.打開設備管理界面查看是否有端口
4、查看是否存在端口(注意:查看是否存在端口時,需要將USB轉串口連接到電腦上)
5.再次通過stm32cubemx創建項目。
設置debug方式
設置USART模式為 Asynchronous,這里下方便是他的參數。
后面就是對項目的名字之類的設置像前面那樣設置便可以了,生成代碼。
6打開main.c 文件,在前面添加上頭文件。stdio.h
在代碼的這個位置重寫fputc 函數,以至於可以使用printf從串口輸出。
int fputc(int c, FILE *stream)
{
HAL_UART_Transmit(&huart1,(unsigned char *)&c,1,1000);
return 1;
}
再在主函數的循環之中寫上
while (1)
{
/* USER CODE END WHILE */
printf("hello world\n");
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
再連接電腦將程序燒錄進去。
7.操作連線選取接口為GND、RXD、TXD、3V3,STM32核心板選取端口G、3.3、A9、A10,對應連接.
8.下載安裝串口查看工具,我這里用的是SSCOM可自行選擇別的軟件,結果如下所示,可以看到它在向串口中輸出hello world!