游戏网站logo制作,雄安建设工程信息网站,网站放到iis如何做指向,专做排名的网站通过TTL转USB实现电脑和单片机连通,是我们调试必不可少的工具
查看原理图,使用USART1,它们的TX和RX分别在PA9和PA10 新建Usart.c存放串口模块的初始化
这段代码是复制了正点原子的工程,添加到前面
#if SYSTEM_SUPPORT_OS
#include includes.h //ucos 使用 …
通过TTL转USB实现电脑和单片机连通,是我们调试必不可少的工具
查看原理图,使用USART1,它们的TX和RX分别在PA9和PA10 新建Usart.c存放串口模块的初始化
这段代码是复制了正点原子的工程,添加到前面
#if SYSTEM_SUPPORT_OS
#include includes.h //ucos 使用
#endif#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x x;
}
#endif #if EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx-SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15 接收完成标志
//bit14 接收到0x0d
//bit13~0 接收到的有效字节数目
u16 USART_RX_STA0; //接收状态标记
USART1初始化
void Uart_init(u32 bound)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1GPIOA时钟//USART1_TX GPIOA.9GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, GPIO_InitStructure);//初始化GPIOA.9//USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //IRQ通道使能NVIC_Init(NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate bound;//串口波特率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); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE); //使能串口1 }
中断服务添加处理
void USART1_IRQHandler(void) //串口1中断服务程序
{u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真则需要支持OS.OSIntEnter();
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res USART_ReceiveData(USART1); //读取接收到的数据if(Res A) g_USART1_FLAG1 1;if(Res B) g_USART1_FLAG1 2;if(Res C) g_USART1_FLAG1 3;if((USART_RX_STA0x8000)0)//接收未完成{if(USART_RX_STA0x4000)//接收到了0x0d{if(Res!0x0a)USART_RX_STA0;//接收错误,重新开始else USART_RX_STA|0x8000; //接收完成了 }else //还没收到0X0D{ if(Res0x0d)USART_RX_STA|0x4000;else{USART_RX_BUF[USART_RX_STA0X3FFF]Res ;USART_RX_STA;if(USART_RX_STA(USART_REC_LEN-1))USART_RX_STA0;//接收数据错误,重新开始接收 } }} }
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真则需要支持OS.OSIntExit();
#endif
}
#endif
创建串口接收函数
发送指令过去让我们的单片机做点事情
char temp;//串口接收判断
void Usatr_If(void)
{if(g_USART1_FLAG1 1 | g_USART2_FLAG1 1 ){if(temp ! A){printf(Is A,LED Open\n);}temp A;LED RESET;}if(g_USART1_FLAG1 2 | g_USART2_FLAG1 2){if(temp ! B){printf(Is B,LED Close\n);}temp B;LED SET;}if(g_USART1_FLAG1 3 | g_USART2_FLAG1 3){if(temp ! C){printf(Is C,LED Flashing\n);}temp C;LED !LED;}
}
重定向printf函数
这一步是非常重要的
//重定义fputc函数
int fputc(int ch, FILE *f)
{ while((USART1-SR0X40)0);//循环发送,直到发送完毕 USART1-DR (u8) ch; return ch;
}
main.c调用初始化
Uart_init(115200);
初始化之后就能正常打印了 测试
本程序的现象就是 输入A,串口打印Is A,LED Open,开启LED 输入B,串口打印Is B,LED Close,关闭LED 输入B,串口打印Is C,LED Flashing,闪烁LED USART1串口模块