文章目录
前言
提示:这里可以添加本文要记录的大概内容:
最近开始调试别人设计的板子,而不是厂商卖的开发板,记录一下调试过程中遇到的问题以及解决办法。
本文要实现每间隔一秒通过USB转串口串口向PC发送一次字符串,芯片用的是STM32H743XIH6,采用的外设是TIM6和USART1,用一个LED显示定时器程序运行
提示:以下是本篇文章正文内容,下面案例可供参考
一、CubeMX配置
芯片选择STM32H743XIHx,TFBGA240封装
1.RCC配置
HSE高速时钟使用外部晶振,其他采用默认设置。
接下来配置时钟
由于TIM6为基本定时器,挂载在低速总线APB1上(除APB1以外都是高速,TIM7也是基本定时器也在APB1上)。这里配置的是240MHz,这关系到下一步TIM6定时器的参数配置。
2.TIM6配置
在Parameter Settings选项卡中设置Prescaler分频系数、Counter Mode计数模式和Counter Period计数周期。由于基本定时器只支持向上计数,所以Counter Mode只能选择Up。
本文用定时器中断来实现定时发送,则Prescaler分频系数和Counter Period计数周期的配置就关系到定时器中断的周期。计算方式如下:
周期=APB1 Timer Clocks/Prescaler/Counter Period
本文要求周期为1s,则周期T=240000000Hz/24000/10000=1s,在配置参数时应当-1,Prescaler=24000-1,Counter Period=10000-1。
然后记得勾选定时器中断。
3.USART1配置
记得勾选中断。
由于USART1有不同的复用引脚可以选择,所以要根据电路原理图设计选择对应的引脚,这里我们用的是PA9和PA10。引脚模式选择推挽输出(Altemate Function Push Pull),输出上拉(Pull-Up),最大输出速度为高(High)。
波特率设置为115200,数据位8,无校验,停止位1。
4.GPIO配置
设计的板子上有一个LED用来指示程序运行,对应的引脚为PA15。具体配置如下图:
5.DEBUG配置
采用SW模式下载和调试程序。
6.生成代码
部分设置如图所示。
最后点击GENERATE CODE生成代码。
二、Keil5
1.打开工程
打开工程后记得添加startup_stm32h743xx.s文件,否则会出错。
2.Target配置
打开Target配置选项卡。
上图红框处必须要勾选,否则串口重定向后无法使用printf函数,程序会卡死。
Output选项卡如下图所示:
红框中选项不勾选可以加快编译速度,勾选可以右键跳转到函数或变量定义处。
Debug选项卡如下图所示:
红框处选择自己使用的仿真器,我这用的是野火的DAP,点击Settings后如下图所示:
看见上图红框内容则表示电脑已识别对应仿真器。
Uitilities选项卡如下图所示:
需要关注的是红框内的选项,勾选Use Debug Driver。点击Settings后如下图所示:
勾选Reset and Run可使单片机程序下载完后立即开始运行,无需手动按下复位键。如中间的红框处没有显示,可点击Add按钮添加。
三、代码
1.main.c
可在此处添加自己的代码,这里我们暂时不需要。
2.usart.c
需要修改的代码主要有以下几处。
其次是使用printf函数打印字符串时需要重定向,程序如下:
/*发送字符串*/
void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str)
{
unsigned int k=0;
do
{
HAL_UART_Transmit( &huart1,(uint8_t *)(str + k) ,1,1000);
k++;
} while(*(str + k)!='\0');
}
///重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口DEBUG_USART */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
///重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
int ch;
HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
别忘了添加头文件:
#include <stdio.h>
3.tim.c
需要修改的代码如下所示:
首先,启动定时器中断。
然后,添加中断回调函数。
/*周期回调函数,在定时器中断中调用*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);//LED3引脚输出反转
printf("ok!;\n");
}
}
四、串口定时发送测试
打开串口助手查看结果,每隔1s发送一次字符串。
LED闪烁。
总结
头一次写文章,记录一下遇到的问题和解决办法,省的自己弄完过段时间就全忘了。