0目標1STM32串口簡介
2硬件設計3軟件設計
4下載驗證
0.目標
利用串口1不停的打印信息到電腦上,同時接收從串口發過來的數據,把發送過來的數據直接送回給電腦。
1.STM32串口簡介
串口設置的一般步驟可以總結為如下幾個步驟:
1)串口時鐘使能,GPIO時鐘使能
2)串口復位
3) GPIO端口模式設置
4)串口參數初始化
5)開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個步驟)
6)使能串口
7)編寫中斷處理函數
注:對于復用功能的IO,我們首先要使能GPIO時鐘,然后使能復用功能時鐘,同時要把GPIO模式設置為復用功能對應的模式。
查看手冊《STM32 中文參考手冊 V10》P110 的表格“8.1.11 外設的 GPIO 配置:
2硬件設計
(1)LED0接PA0
(2)串口1
3.軟件設計
新建工程:
其中SYSTEM下放置原子哥提供的三個文件夾delay、sys、uart(及其文件),HARDWARE下建LED文件夾,及其內建LED.C與LED.H文件。
uart中串口函數:
voiduart_init(u32bound){
//GPIO端口設置
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1,GPIOA時鐘
//USART1_TXPA.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);
//USART1_RXPA.10
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA,&GPIO_InitStructure);
//Usart1NVIC配置
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;//一般設置為9600;
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);//初始化串口
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟中斷
USART_Cmd(USART1,ENABLE);//使能串口
}
LED.c內容:
#include“led.h”
//初始化PA0為輸出口。并使能這個口的時鐘
//LEDIO初始化
voidLED_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA端口時鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//LED0--》PA0端口配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度為50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure);//根據設定參數初始化GPIOA0
GPIO_SetBits(GPIOA,GPIO_Pin_0);//PA0輸出高
}
led.h:
#ifndef__LED_H
#define__LED_H
#include“sys.h”
#defineLED0PAout(0)//PA0
voidLED_Init(void);//初始化
#endif
主函數:
#include“led.h”
#include“delay.h”
#include“sys.h”
#include“usart.h”
intmain(void)
{
u8t;
u8len;
u16times=0;
delay_init();//延時函數初始化
NVIC_Configuration();//設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
uart_init(9600);//串口初始化為9600
LED_Init();//LED端口初始化
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3f;//得到此次接收到的數據長度
printf(“ 您發送的消息為: ”);
for(t=0;t
{
USART_SendData(USART1,USART_RX_BUF[t]);//向串口1發送數據
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
}
printf(“ ”);//插入換行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf(“ 口袋里的超超 串口實驗 ”
評論
查看更多