今日學(xué)習(xí)使用STM32 C8T6的串口,我們在經(jīng)過學(xué)習(xí)筆記2的總結(jié)歸納可知,STM32 C8T6最小系統(tǒng)板上有三路串口,如下圖:
?今日我們就著手學(xué)習(xí)如何配置開通這些串口進(jìn)行收發(fā),這里不講串口通信概念與基礎(chǔ),可以自行網(wǎng)上查找,本文直接開始介紹庫函數(shù)與編程實現(xiàn):
串口配置相關(guān)庫函數(shù)介紹:
?文章來源:http://www.zghlxwxcb.cn/news/detail-686550.html
打開串口GPIO的時鐘:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
/*
#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100)
*/
?
打開串口外設(shè)的時鐘:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
/*
#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000)
#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000)
*/
?
串口的初始化配置:
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
/*
USART1 USART2 USART3
*/
?
向量中斷控制器組選擇:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
?
初始化配置NVIC:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
?
串口接收:
USART_ReceiveData(USART1)
串口配置編程:
首先創(chuàng)建好要用的幾個文件.c 與.h,在添加進(jìn)工程,別忘了添加路徑~
?
串口的初始化:
以下是串口1的初始化以及配置中斷優(yōu)先級,中斷優(yōu)先級的配置分為主優(yōu)先和子優(yōu)先,有關(guān)中斷優(yōu)先級的配置這放在以后再說~~~,
測試工程文件我還編寫了串口2,3的初始化,可以下載測試觀察~
#include "USART_init.h"
void Usart1_Init(unsigned int baud)
{
GPIO_InitTypeDef gpio_initstruct;
USART_InitTypeDef usart_initstruct;
NVIC_InitTypeDef nvic_initstruct;
// 打開串口GPIO的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 打開串口外設(shè)的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//PA9 TXD // 將USART Tx的GPIO配置為推挽復(fù)用模式
gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_initstruct.GPIO_Pin = GPIO_Pin_9;
gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_initstruct);
//PA10 RXD // 將USART Rx的GPIO配置為浮空輸入模式
gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio_initstruct.GPIO_Pin = GPIO_Pin_10;
gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_initstruct);
usart_initstruct.USART_BaudRate = baud; //配置波特率
usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬件流控
usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和發(fā)送
usart_initstruct.USART_Parity = USART_Parity_No; //無校驗
usart_initstruct.USART_StopBits = USART_StopBits_1; //配置停止位 1位停止位
usart_initstruct.USART_WordLength = USART_WordLength_8b; //配置 針數(shù)據(jù)字長 8位數(shù)據(jù)位
// 完成串口的初始化配置
USART_Init(USART1, &usart_initstruct);
USART_Cmd(USART1, ENABLE); //使能串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 嵌套向量中斷控制器組選擇 */
nvic_initstruct.NVIC_IRQChannel = USART1_IRQn; /* 配置USART為中斷源 */
nvic_initstruct.NVIC_IRQChannelCmd = ENABLE; /* 使能中斷 */
nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0; /* 搶斷優(yōu)先級*/
nvic_initstruct.NVIC_IRQChannelSubPriority = 2; /* 子優(yōu)先級 */
NVIC_Init(&nvic_initstruct); /* 初始化配置NVIC */
}
?
串口中斷服務(wù)函數(shù)的編寫:
首先在啟動文件找到三個串口的中斷服務(wù)函數(shù):
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷
{USART_ClearFlag(USART1, USART_FLAG_RXNE);}
//返回收到的任意數(shù)據(jù)
USART_SendData(USART1,USART_ReceiveData(USART1));
}
測試結(jié)果截圖:
?
工程下載:
https://download.csdn.net/download/qq_64257614/88201777?spm=1001.2014.3001.5503文章來源地址http://www.zghlxwxcb.cn/news/detail-686550.html
到了這里,關(guān)于STM32 F103C8T6學(xué)習(xí)筆記3:串口配置—串口收發(fā)—自定義Printf函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!