stm32串口的引入
串口,在STM32F10x芯片一共有5個串口,USART1 2 3 UART4 5 一共5個串口
每一個串口真正發揮作用,2個腳,資料從芯片里出去,另外資料進入到芯片里面去 TX (trasimt) RX (receive)
串口1 USART1 TX PA9 PA10,原理圖是這樣,是從芯片的使用說明 datasheet看的,是從資料手冊引腳描述表格找到的,
UART1的開發流程
- 開啟APB2時鐘開相關片上外設時鐘,USART1 GPIOA,串口除了串口1掛在APB2時鐘線上,其余都掛在APB1
- 相關的GPIO口初始化,初始化發送,接收引腳,分別為PA9,PA10
- 初始化UART1的波特率,資料位,停止位等等的配置
- 設定NVIC中斷分組,目的是當多個中斷發生時的優先級
- 開啟中斷,在中斷函式里面接收發送的函式
- 通過DR暫存器發送函式
stm32的庫函式版本
void uart_init(u32 bound){
//GPIO埠設定
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的引數初始化VIC暫存器
//USART 初始化設定
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位資料格式
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_Rx | USART_Mode_Tx; //收發模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
USART_Cmd(USART1, ENABLE); //使能串口1
}
void USART1_IRQHandler(void) //串口1中斷服務程式
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的資料必須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART1); //讀取接收到的資料
USART_SendData(USART1,Res);
}
}
int main(void)
{
u16 t;
u16 len;
u16 times=0;
delay_init(); //延時函式初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定NVIC中斷分組2:2位搶占優先級,2位回應優先級
uart_init(9600); //串口初始化為115200
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的資料長度
printf("\r\n您發送的訊息為:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1發送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
}
printf("\r\n\r\n");//插入換行
USART_RX_STA=0;
}
}
串口相關暫存器
1.狀態暫存器

2.資料暫存器

3.波特率暫存器

4.控制暫存器1


暫存器版本
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到 USARTDIV
mantissa=temp; //得到整數部分
fraction=(temp-mantissa)*16; //得到小數部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能 PORTA 口時鐘
RCC->APB2ENR|=1<<14; //使能串口時鐘
GPIOA->CRH&=0XFFFFF00F;//IO 狀態設定
GPIOA->CRH|=0X000008B0;//IO 狀態設定
RCC->APB2RSTR|=1<<14; //復位串口 1
RCC->APB2RSTR&=~(1<<14);//停止復位
//波特率設定
USART1->BRR=mantissa; // 波特率設定
USART1->CR1|=0X200C; //1 位停止,無校驗位.
#if EN_USART1_RX //如果使能了接收
//使能接收中斷
USART1->CR1|=1<<5; //接識訓沖區非空中斷使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//組 2,最低優先級
#endif
}
int main(void)
{
u16 t; u16 len; u16 times=0;
Stm32_Clock_Init(9); //系統時鐘設定
uart_init(72,115200); //串口初始化為 115200
delay_init(72); //延時初始化
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3FFF;//得到此次接收到的資料長度
printf("\r\n 您發送的訊息為:\r\n\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待發送結束
}
printf("\r\n\r\n");//插入換行
USART_RX_STA=0;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330424.html
標籤:其他
上一篇:入門智能車 | 基于逐飛開源庫 - 0. 初識MCU
下一篇:#智能宿舍門禁 esp8266+RC522模塊+DFPlay Mini Mp3模塊實作宿舍智能門鎖//NFC//物聯網
