usart 异步串口通信需要两个引脚,TX、RX,如果和电脑通讯需要usb转串口线。
usart 的编程要点是:
(1)知道使用的是哪个串口,初始化RX、TX的GPIO时钟 和USART时钟;
(2)GPIO初始化,复用USART
(3)配置USART参数(波特率、位数、校验等)
(4)配置NVIC中断,USART中断配置(中断源、中断服务函数、使能)
(5) USART使能
(6)USART接受、发送函数编写;
USART的编写除了配置GPIO还要配置USART相关的时钟等;
新建usart.h 和usart.c
usart.h 中宏定义:
// usart_1
#define DEBUG_USARTx USART1
#define DEBUG_USART_CLK RCC_APB2Periph_USART1
#define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd
#define DEBUG_USART_BAUDRATE 115200
// USART GPIO 引脚宏定义
#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA)
#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
//TX
#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9
//RX
#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10
// Interrupt of usart1
#define DEBUG_USART_IRQ USART1_IRQn
#define DEBUG_USART_IRQHandler USART1_IRQHandler
usart 配置的时候要完成这两个结构体 和初始化工作
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
1)GPIO 和usart 的时钟要打开
2)TX引脚要配置为推挽输出,RX的引脚要设置为浮空输入
3) 串口的工作参数配置(常用的):波特率、字长、停止位、校验位、硬件控制流、工作模式;
4)中断的配置,使能中断
5)使能串口
编写收发程序:
/***************** 发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
/* 发送一个字节数据到USART */
USART_SendData(pUSARTx,ch);
/* 等待发送数据寄存器为空 */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
/***************** 发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
unsigned int k=0;
do {
Usart_SendByte( pUSARTx, *(str + k) );
k++;
} while (*(str + k)!='\0');
/* 等待发送完成 */
while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET) {
}
}
其中注意USART_GetFlagStatus()函数是检查USART_GLAG_TC 和TXE 的差别,一次循环发送结束标志位,一个是发送结束标志位。
串口中断服务程序在stm32f10x_it.c 中,注意包含usart.h 的头文件;
// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{
uint8_t ucTemp;
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
ucTemp = USART_ReceiveData(DEBUG_USARTx);
USART_SendData(DEBUG_USARTx,ucTemp);
}
}
main.c :
int main(void)
{
// LED config
Led_GPIO_config();
// exiti config
EXIT_Key_Config();
//systick config
SysTick_Iint();
// usart config
USART_Config();
Usart_SendString(DEBUG_USARTx,"This is test for usart_debug \n开始...\n");
while(1)
{ Usart_SendString(DEBUG_USARTx,"LED3 亮\n");
LED3_ON;
Delay_10us(100000);
Usart_SendString(DEBUG_USARTx,"LED3 灭\n");
LED3_OFF;
Delay_10us(100000);
Usart_SendString(DEBUG_USARTx,"LED3 亮\n");
LED3_ON;
Delay_1s(10);
Usart_SendString(DEBUG_USARTx,"LED3 灭\n");
LED3_OFF;
Delay_1s(10);
}
}
第二部分内容(USART)
printf ()函数的使用:
(1)重定向输入输出函数:
//重定向c 库函数printf 到串口,重定向后可使用printf 函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);
}
//重定向c 库函数scanf 到串口,重写向后可使用scanf、getchar 等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_USARTx);
}
(2)MDK的工程选项把“Use MicroLIB”勾选上,MicoroLIB 是缺省C 库的备选库;
(3)printf、scanf 函数需要在文件中包含stdio.h 头文件
(4)16 ch=getchar(); printf("接收到字符:%c\n",ch); //实现接受字符的处理;