所用模块
野火指南者开发板stm32f103vet6,JLINK烧录器,UART串口模块
搭建过程
先用cubemx生成项目,具体过程如下:
step1:
step2:
step3:
step4:
step5:
uart.c添加代码
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,1000);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
HAL_UART_Receive (&huart1 ,(uint8_t *)&ch,1,1000);
return ch;
}
main.c添加代码
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf(" receive data!\n");
HAL_Delay(1000);
}
/* USER CODE END 3 */
调试bug
bug1 ☞ **JLink Info: T-bit of XPSR is 0 but should be 1. Changed to 1.
解决方法:这是由于JLINK供电不足导致的,需要供电线额外供电
bug2 ☞ 可以正常运行,但printf无法重定向(调试时,在printf语句左边设置断点,但运行时却直接跳过printf语句而进入HAL_Delay函数中)
解决办法:设置reset and run
总结
☞ JLINK烧录需要供电线额外供电
☞ 需要使用微库(勾选MicroLib)或使用标准库并在uart.c中添加如下代码
#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)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,1000);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
HAL_UART_Receive (&huart1 ,(uint8_t *)&ch,1,1000);
return ch;
}
#endif
☞ 设置reset and run