嵌入式入門學習---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中創建一個新的項目。

1634739073644

2.選擇自己的芯片型號,這里我是STM32F103C8

1634739184919

3.配置系統調試接口sys,選擇Serial Wire

1634739257873

4.配置引腳功能在芯片上找到對應的引腳,點擊它,選擇對應的功能。這里先將PC13也就是板載的LED口設置為輸出模式。

1634739345964

在這里可以看到這個口的設置情況。

GPIO output level:有low和high兩種選擇,一般選擇low
GPIO mode:推挽輸出和開漏輸出兩者模式,兩者模式的區別在於推挽輸出中1代表VCC,0表示GND;開漏輸出中1代表高阻態,0代表GND。
GPIO Pull-up/Pull-down:輸入需要上下拉,輸出一般沒有上下拉
Maxinum output speed:最大的輸出速度,一般選擇low就可以了。

1634739375466

5.再點擊project manager界面進行項目的配置。設置項目名字,編譯軟件和相關的固件庫版本。

1634739593950

之后直接點擊右上角GENERATE CODE,生成好之后直接點擊Open Projecet

3.通過C語言以及基於HAL函數庫兩種方式實現流水燈。

1634739643971

1634739697681

再keil中會顯示如上界面讓你選擇設備,選擇自己相應的設備型號即可。

1634739750850

這樣便打開了這個項目。此時編譯一下,設置好燒錄相關的,直接將項目燒入板子中便會發現PC13那個小led會亮起來。

1634740560046

現在只需要再在代碼中加入延時的函數,再多選擇幾個口接上led燈便可以實現流水燈了。

再次打開cubemx打開剛剛的項目,我是將里面的A7,B9,C15三個口設置為輸出模式。

1634740981274

再次生成代碼,再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)

1634742034109

#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.在編譯調試的設置之中對下面參數如下設定。

1634815003005

2.選擇邏輯分析儀。

1634815106481

3.在setup中設置需要觀察的端口。

1634815139629

4.點擊右上角后輸入你所要觀察的引腳。例如這里我要觀察的是PB9,輸入GPIOB_IDR.9回車即可。

1634817640972

5.要將輸出的波形設置為bit便於觀察。

1634817728751

6.再關掉這個窗口,點擊run便可以再界面里看到信號的波形結果。

1634817800159

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.打開設備管理界面查看是否有端口

1634818834523

4、查看是否存在端口(注意:查看是否存在端口時,需要將USB轉串口連接到電腦上)

1634819553229

5.再次通過stm32cubemx創建項目。

設置debug方式

1634819940661

設置USART模式為 Asynchronous,這里下方便是他的參數。

1634820035426

后面就是對項目的名字之類的設置像前面那樣設置便可以了,生成代碼。

1634820127552

6打開main.c 文件,在前面添加上頭文件。stdio.h

1634820210548

在代碼的這個位置重寫fputc 函數,以至於可以使用printf從串口輸出。

int fputc(int c, FILE *stream)
{
	HAL_UART_Transmit(&huart1,(unsigned char *)&c,1,1000);
	return 1;
}

1634820585747

再在主函數的循環之中寫上

  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!

1634823811718


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM