測試背景:Device--Stm32f103vet6--Usart1;MDK5說明:在嵌入式方面,串口通信有著不可替代的優勢,每當我們入手一塊新型的單片機時,往往會先學習”點燈大法(IO口)“,然后學習串口通信,毫不夸張的說,串口相當于單片機的一雙眼睛,通過這雙眼睛,可以監視單片機的運行情況,及時發現問題,加快學習的速度。本篇文章以Stm32f103vet6的Usart1為例來舉例說明如何利用串口中斷與上位機進行簡單通信,以為筆記。(后附程序)
主要有以下幾個步驟:
1、系統時鐘的配置:本文系統時鐘設置為72M,并開啟Usart1的時鐘;
2、IO口的配置:PA9h和PA10;
3、Usart的配置:本文波特率115200;
4、中斷優先級的設置。
下為程序代碼:
//主函數文件
#include"stm32f10x_lib.h"
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidUSART_Configuration(void);
voidNVIC_Configuration(void);
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
NVIC_Configuration();
while(1)
{
}
}
voidRCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA, ENABLE);
}
voidGPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
}
voidUSART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
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_Rx |USART_Mode_Tx;
USART_Init(USART1 , &USART_InitStructure);
//使能USART1接收中斷
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收中斷使能
USART_Cmd(USART1 , ENABLE);
}
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM ,0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//中斷函數
voidUSART1_IRQHandler(void)
{
//接收中斷(接收寄存器非空)
if(USART1->SR & (1<<5))
{
USART_SendData(USART1 ,USART_ReceiveData(USART1)); //發送數據
}
}
|