嵌入式入門學習---STM32實現流水燈以及USART串列埠通訊基於CUBEMX和KEIL
嵌入式學習---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!