[STM32F1] VSCODE STM32 裸机之串口

[复制链接]
 楼主| zero949079783 发表于 2021-10-18 22:16 | 显示全部楼层 |阅读模式
本帖最后由 zero949079783 于 2021-10-26 19:48 编辑

开发环境:VSCODE(gcc编译链)+STM32CubeMX(也可以使用HUAWEI-LiteOS-Studio) 。 编译环境就不写了,网上有很多教程。也可以使用KEIL,代码是通用的
代码:链接:https://pan.baidu.com/s/1uXfIR0GFQOBZPl1NfQP08w  
提取码:6b0c

1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png

使用GCC重定向c库函数printf到串口 :
  1. //重定向c库函数printf到串口,重定向后可使用printf函数(GCC)
  2. int _write(int fd, char *ptr, int len)  
  3. {  
  4.   HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF);
  5.   return len;
  6. }

  7. ////重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数(GCC)
  8. int _read (int fd, char *ptr, int len)
  9. {
  10. *ptr = 0x00; // Flush the character buffer
  11. HAL_UART_Receive(&huart1, (uint8_t*) ptr, 1, 0xFFFF);
  12. return 1;
  13. }

GCC-1.png

关于无法打印浮点数的问题。试了试好像确实没办法打印浮点数,用 sprintf() 也不行。
不过问题不大,在 Makefile 文件中找到 LDFLAGS 选项然后在里面添加 -u _printf_float 参数就可以了,添加以后printf() 和 sprintf() 正常使用。

日常写程序时常用的除了 printf() 还有 sprintf() 和 sscanf() 这两个数字和字符串互转的函数,前面说了 sprintf() 已经可以正常用了,
那么 sprintf() 呢?其实一样的道理, sprintf() 默认也是不能转浮点数的,但是在 Makefile 里对应的加一句 -u _scanf_float
GCC-2.png
使用KELI重定向c库函数printf到串口 :

  1. ///重定向c库函数printf到串口,重定向后可使用printf函数(KEIL)
  2. int fputc(int ch, FILE *f)
  3. {
  4.                 /* 发送一个字节数据到串口 */
  5.                 USART_SendData(USART1, (uint8_t) ch);
  6.                
  7.                 /* 等待发送完毕 */
  8.                 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);               
  9.       
  10.                 return (ch);
  11. }

  12. ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数(KEIL)
  13. int fgetc(FILE *f)
  14. {
  15.                 /* 等待串口输入数据 */
  16.                 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

  17.                 return (int)USART_ReceiveData(USART1);
  18. }

K-4.png
STM32 标准库3.5修改默认外部8M晶振为16M晶振:

我们知道,F103默认的外部晶振是8M,系统时钟频率是72M,但实际项目中,多数情况下可能会采用16M,25M晶振等等,如果不注意,很容易就超频,导致单片机无法正常运转,此处以16M晶振为例,说明一下时钟频率的修改。

1.修改stm32f10x.h中HSE_Value的值,8M修改为16M。

#define HSE_Value    ((uint32_t)16000000) /*!< Value of the External oscillator in Hz*/

2.修改system_stm32f10x.c中static void SetSysClockTo72(void)函数。

在此函数中,我们不需要修改其他地方,只需修改PLLCLK时钟设置。

/*!< PLLCLK = 8MHz * 9 = 72 MHz */

原来的代码:
//    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
//    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9);

修改后:
        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);//先将晶振分频,再倍频, 16 / 2 * 9 = 72,之所以使用这个函数,是因为我当前使用的库有些标志没有。

如果大家使用的库有以下标志,建议大家使用下面的两句话。

/*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9);
K-1.png K-2.png K-3.png


chenqianqian 发表于 2021-10-19 08:08 来自手机 | 显示全部楼层
谢谢分享经验
zljiu 发表于 2021-11-5 15:57 | 显示全部楼层
恩 只跑串口裸机就够了
drer 发表于 2021-11-5 15:58 | 显示全部楼层
还有工程代码啊  不错
aoyi 发表于 2021-11-5 15:59 | 显示全部楼层
之前使用的是什么库啊
coshi 发表于 2021-11-5 16:01 | 显示全部楼层
超频的话会出现什么现象呢
wiba 发表于 2021-11-5 16:07 | 显示全部楼层
可以使用iar吗
 楼主| zero949079783 发表于 2021-11-5 22:50 | 显示全部楼层
STM32CubeMX 生成IAR就行了
 楼主| zero949079783 发表于 2021-11-6 21:45 | 显示全部楼层
coshi 发表于 2021-11-5 16:01
超频的话会出现什么现象呢

串口乱码,MCU温度有些高
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

91

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部