1. 程式人生 > 其它 >嵌入式入門學習---STM32實現流水燈以及USART串列埠通訊基於CUBEMX和KEIL

嵌入式入門學習---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!