STM32 学习笔记(5)USART

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); //实现接受字符的处理;

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值