資源:STM32F407有2個UART(通用異步收發器),4個USART(通用異步/同步收發器)
在STM32F407ZET6的手冊上有描述,
這些接口所對應的引腳如下:
在這裏我們選用串口1進行簡單編程:
實現功能吐下:
1.每秒發送一個數字
2.進行數據回傳
其所要配置的內容如下:
1.GPIO的時鐘使能
2.聲明一個GPIO結構體變量,進行定義並進行初始化,主要是開啓複用功能
3.將GPIO複用爲何,將IO口功能配置爲USART功能
4.USART1的時鐘進行使能
5.聲明一個USART結構體變量,進行定義並進行初始化,設置其波特率,停止位,字長,是否硬件流控制,收發模式,
6.設置中斷優先組
7.聲明一箇中斷優先組變量,進行定義並進行初始化,設置什麼爲中斷源,其搶佔優先組,響應優先組的值
8.配置串口中斷源爲哪個:是接收中斷還是發送中斷
9.使能USART1
int main(void)
{
//配置systick時鐘的時鐘源
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
if(SysTick_Config(SystemCoreClock/1000)!=0)
{
}
//配置中斷優先分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//聲明一個GPIO結構體變量
GPIO_InitTypeDef GPIO_InitStructure;
//聲明一個USART結構體變量
USART_InitTypeDef USART_InitStructure;
//使能USART1外設時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//使能GPIO外設時鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//定義GPIO結構體變量,複用該IO口作爲串口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//兩個IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //複用模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50MHz
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推輓輸出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
//定義USART結構體變量
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //收發模式
USART_InitStructure.USART_Parity=USART_Parity_No; //無校準
USART_InitStructure.USART_StopBits=USART_StopBits_1; //1位停止位
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //字長爲8
//明確IO爲何功能進行配置
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//串口進行初始化
USART_Init(USART1,&USART_InitStructure);
//串口中斷優先組結構體變量聲明
NVIC_InitTypeDef NVIC_InitStructure_usart;
//定義該串口中斷優先組分組
NVIC_InitStructure_usart.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure_usart.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure_usart.NVIC_IRQChannelPreemptionPriority=0x01; //搶佔優先級設置
NVIC_InitStructure_usart.NVIC_IRQChannelSubPriority=0x02; //響應優先級設置
//初始化該優先級分組
NVIC_Init(&NVIC_InitStructure_usart);
//配置串口接收中斷
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//使能串口1
USART_Cmd(USART1,ENABLE);
while(1)
{
//定時發送數據的功能
USART_SendData(USART1,9);
delay_sys(1000);
}
}
//進行數據的回傳
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判斷是否有接收中斷
{
res=USART_ReceiveData(USART1);
USART_SendData(USART1,res);
}
}
//延時功能
int delaytime;
void delay_sys(unsigned int time)
{
delaytime=time;
while(delaytime!=0);//延時
}
//systick中的中斷函數,對其進行編寫
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
if(delaytime!=0)
{
delaytime--;
}
}
最後可以實現所要求的功能。