蓝桥杯的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 );
}
}