蓝桥杯嵌入式串口实现

蓝桥杯的CN2 USB可以当做串口使用,连接的串口二
在这里插入图片描述
串口2在APB1
在这里插入图片描述
抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。 而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。

用printf的时候记的keil勾选使用微库

遇见错误:原来是头文件写错。在单独编译usart.c文件时正常,但是linking时就会报错
在这里插入图片描述
在这里插入图片描述
依旧报错。原来是要把usart.c和misc.c添加进工程
在这里插入图片描述
usart驱动编写:
过程即开APB时钟,GPIO初始化,UASRT初始化,NVIC初始化
包装USART_SendData成USART_SendChar
再写USART_SendString

#include "usart.h"

void USART2_Init(unsigned long ulBaud)
{
	GPIO_InitTypeDef GPIO_Inistruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	
	GPIO_Inistruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_Inistruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Inistruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_Inistruct);
	
	GPIO_Inistruct.GPIO_Pin=GPIO_Pin_3;
	GPIO_Inistruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA,&GPIO_Inistruct);
	
	USART_InitStruct.USART_BaudRate=ulBaud;
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStruct.USART_Parity=USART_Parity_No;
	USART_InitStruct.USART_StopBits=USART_StopBits_1;
	USART_InitStruct.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART2,&USART_InitStruct);
	//ÔÊÐí´®¿Ú2ÖÐ
	USART_Cmd(USART2,ENABLE);
	//¿ª½ÓÊÕÖжÏ
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
	//¿ªNVIC´®¿Ú2ÖжÏ
	NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
	NVIC_Init(&NVIC_InitStruct);
}

//·¢ËÍ×Ö·û
unsigned char USART_SendChar(USART_TypeDef* USARTx,unsigned char ucChar)
{
	while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE))
	{
		;
	}
	USART_SendData(USARTx,ucChar);
	return ucChar;
}
void USART_SendString(USART_TypeDef* USARTx,unsigned char* pucStr)
{
	while(*pucStr !='\0')
	{
		USART_SendChar(USARTx,*pucStr++);
	}
}
//printfº¯ÊýÖض¨Ïòµ½´®¿Ú¶þ£¨Ê¹ÓÃMicroLib£©
int fputc(int ch,FILE* f)
{
	return(USART_SendChar(USART2,ch));
}

注意波特率的设置,否则就是一行行长短不一的00
时间戳是个好功能
在这里插入图片描述
串口二将接收的数据回传

void USART2_IRQHandler(void)                	
{
	u8 Res;
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 
	{
	  Res =USART_ReceiveData(USART2);	
	  printf("%c",Res );			 
	} 
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值