1.概述:
硬件资源:正点原子stmf7水星版、ATK-ESP8266的WiFi模块;
编译软件:MDK5;
操作系统:RT-Thread实时操作系统。
目标需求:利用uart1重定义实现printf输出调试打印信息;usart3连接ATK-ESP8266模块实现AT通讯;ESP8266模块通过MQTT协议连接阿里云物联网平台。
2.工程代码的移植创建:
2.1 RT-Thread代码下载:
? ? ? ??RT-Thread官网代码下载地址,选择其中一种方式下载即可。熟悉env工具的使用。
2.2 开发板bsp制作:
BSP官方制作教程,这里废话不多说,根据自己的开发板硬件资源按照教程步骤配置即可,最后即可生成MDK5工程。
3.工程代码编译:
编译刚生成的MDK5工程代码,如果配置正确的话,是无报错的。
接下来,在工程目录上创建一个uart.c文件编写串口逻辑代码。
添加如下段代码,重定义fputc,这里我是uart1做打印口输出,根据实际配置。
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->ISR&0X40)==0);
USART1->TDR=(uint8_t)ch;
return ch;
}
#endif
串口逻辑代码可以参考正点原子实现原理,这里不做具体说明,很简单的,不懂的百度正点原子教程观看理解。这里仅贴出代码
官方
void uart1_init(uint32_t bound)
{
//UART 初始化设置
UART1_Handler.Instance=USART1; //USART1
UART1_Handler.Init.BaudRate=bound; //波特率
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1
HAL_UART_Receive_IT(&UART1_Handler, (uint8_t *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART1)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_9;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FAST;
GPIO_Initure.Alternate=GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_10;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
}
void USART1_IRQHandler(void)
{
uint8_t Res;
if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))
{
HAL_UART_Receive(&UART1_Handler,&Res,1,1000);
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(Res!=0x0a)
USART_RX_STA=0;
else
USART_RX_STA|=0x8000;
}
else
{
if(Res==0x0d)
USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))
USART_RX_STA=0;
}
}
}
}
HAL_UART_IRQHandler(&UART1_Handler);
}
?最后,在main函数中,调用初始化uart1,并循环打印“hello”。通过串口调试软件查看打印结果。
因为是带操作系统的,可以创建一个串口的专用线程实现,就不用把所有代码都编写在main里了。
uart1_init(115200);
while(1)
{
printf("hello\r\n");
rt_thread_mdelay(2000);
}
?
说明:此文章仅做步骤记录,对于基本的知识点不做特别说明,可以自行查阅资料。
|