其实在开发板使用的WIFI(ESP8266模块)、蓝牙、GPS都是封装好的模块,根据一些特定指令就即可进行相关操作。如使用AT指令就可以操作WIFI模块。至于具体的wifi模块的AT指令如何使用这里就不说了,改天另外写一个博客吧。
这里主要是就是写USART3的应用,通过USART3接收数据转到USART1打印到串口调试助手。
其实搞这个的话,主要是就是通过所使用的模块与USART3连接,通过CPU连接到USART1转发到PC
1.硬件配置
首先就是在CUBEMX上对管脚进行相应的配置。下面是管脚的配置图
串口1使用的是默认设置。
USART3也是,但是如果要使用GPS的话波特率是要设置为38400 Bits/s,这个是因为ATK_S1216F8_BD模块的出厂默认波特率就是这个。因为涉及到接收和发送,特别是串口的接收是涉及到接收中断的,下面就是关于定时器的配置,在这里使用的是通用定时器7.
由于在整个工作过程中存在优先级的问题(如果没有优先级之分工作就会因此冲突。)所以这里要设置优先级
接下来就是生成工程啦。
2.修改程序
在usart.c文件的中加入Printf的重定义函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (uint8_t) ch;
return ch;
}
uint16_t USART3_RX_STA=0;
uint8_t USART3_RX_BUF[800];
__align(8) uint8_t USART3_TX_BUF[800];
并且在USART3的USART3_MspInit函数中加入USART3的接收函数
/* USER CODE BEGIN USART3_MspInit 1 */
__HAL_UART_ENABLE_IT(&huart3,UART_IT_RXNE); //开启接收中断
HAL_NVIC_EnableIRQ(USART3_IRQn); //使能USART3中断
HAL_NVIC_SetPriority(USART3_IRQn,2,3); //抢占优先级2,子优先级3
MX_TIM7_Init(); //100ms中断
USART3_RX_STA=0; //清零
//TIM7->CR1&=~(1<<0); //关闭定时器7
__HAL_TIM_DISABLE(&htim7);
然后在/* USER CODE BEGIN 1 */加入串口的重定
/* USER CODE BEGIN 1 */
void u3_printf(char* fmt,...)
{
uint16_t i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while((USART3->SR&0X40)==0); //循环发送,直到发送完毕
USART3->DR=USART3_TX_BUF[j];
}
}
/* USER CODE END 1 */
修改完串口的程序之后就是定时器的了
/* TIM7 init function */
void MX_TIM7_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {
0};
htim7.Instance = TIM7;
htim7.Init.Prescaler = 8999;
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
htim7.Init.Period = 999;
htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_Base_Start_IT(&htim7); //使能定时器7和定时器7更新中断:TIM_IT_UPDATE
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM7)
{
/* USER CODE BEGIN TIM7_MspInit 0 */
/* USER CODE END TIM7_MspInit 0 */
/* TIM7 clock enable */
__HAL_RCC_TIM7_CLK_ENABLE();
/* TIM7 interrupt Init */
HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(TIM7_IRQn);
/* USER CODE BEGIN TIM7_MspInit 1 */
HAL_NVIC_SetPriority(TIM7_IRQn,0,1); //设置中断优先级,抢占优先级0,子优先级1
HAL_NVIC_EnableIRQ(TIM7_IRQn)