STM32 學習八 USART通訊3 庫函式方式程式設計
阿新 • • 發佈:2019-01-05
STM32 庫是ST公司針對STM32提供的函式介面,即API,開發簡便、維護維護、閱讀。
CMSIS標準(摘自百度百科):
為了解決不同的晶片廠商生產的Cortex微控制器軟體相容性問題,ARM與晶片廠商建立了CMSIS標準(Cortex MicroController Software Interface Standard)。
以STM32F10XX序列處理為例,介紹CMSIS的使用步驟。
1、從ST官方網站下載3.0以上版本的標準外設庫。
2、基於開發軟體新建工程,建立相應的檔案目錄,注意詢問是否加入啟動檔案時,選擇“否”。
3、根據所選晶片,把Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的啟動程式碼加到工程中。
4、根據處理器FLASH容量的大小,選擇啟動程式碼。stm32f10x.h 的66-73 行表明了啟動程式碼的型別。例如STM32F10X_HD 行表示大容量的,如果不需要直接註釋掉即可。
5、選擇是否啟用標準外設庫。stm32f10x.h的105行的USE_STDPERIPH_DRIVER用於確定是否啟用,如果不啟用直接註釋掉。
6、確定處理器的頻率。system_stm32f10x.c的110-115行用於確定處理器的頻率,註釋掉不需要的即可。例如處理器的頻率為是36MHz,註釋SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz註釋。
STM32 庫函式組織
USART庫函式
程式碼示例:
#include "stm32f10x_lib.h" #include <stdio.h> void RCC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(u32); #define GPIOA_ODR_A (GPIOA_BASE+0x0C) #define GPIOA_IDR_A (GPIOA_BASE+0x08) #define GPIOB_ODR_A (GPIOB_BASE+0x0C) #define GPIOB_IDR_A (GPIOB_BASE+0x08) #define GPIOC_ODR_A (GPIOC_BASE+0x0C) #define GPIOC_IDR_A (GPIOC_BASE+0x08) #define GPIOD_ODR_A (GPIOD_BASE+0x0C) #define GPIOD_IDR_A (GPIOD_BASE+0x08) #define GPIOE_ODR_A (GPIOE_BASE+0x0C) #define GPIOE_IDR_A (GPIOE_BASE+0x08) #define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xF0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2))) #define PAout(n) BitBand(GPIOA_ODR_A,n) #define PAin(n) BitBand(GPIOA_IDR_A,n) #define PBout(n) BitBand(GPIOB_ODR_A,n) #define PBin(n) BitBand(GPIOB_IDR_A,n) #define PCout(n) BitBand(GPIOC_ODR_A,n) #define PCin(n) BitBand(GPIOC_IDR_A,n) #define PDout(n) BitBand(GPIOD_ODR_A,n) #define PDin(n) BitBand(GPIOD_IDR_A,n) #define PEout(n) BitBand(GPIOE_ODR_A,n) #define PEin(n) BitBand(GPIOE_IDR_A,n) int main(void) { u8 data; u8 i; //初始化 RCC_Configuration(); GPIO_Configuration(); USART_Configuration(9600); //UE使能位 data='A'; USART_Cmd(USART1,ENABLE); for(i=0;i<30;i++){ USART_SendData(USART1,data); data++; while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); } } /******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { //----------使用外部RC晶振----------- RCC_DeInit(); //初始化為預設值 RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速時鐘 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速時鐘使能就緒 //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer //FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ RCC_PLLCmd(ENABLE); //Enable PLLCLK while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source //---------開啟相應外設時鐘-------------------- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外設的GPIOA的時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能APB2外設的GPIOC的時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //開啟USART1時鐘 //GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); } /******************************************************************************* * Function Name : GPIO_Configuration * Description : 初始化GPIO外設 USART1與PA9複用.這裡對9 10腳進行設定 * Input : None * Output : None * Return : None *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure USARTx_Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USARTx_Rx as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } void USART_Configuration(u32 rate){ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate=rate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; //校驗 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬體流控制 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //使能 USART_Init(USART1,&USART_InitStructure); //初始化結構體 }