打印
[STM32F1]

VSCODE STM32 裸机之串口

[复制链接]
1266|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zero949079783 于 2021-10-26 19:48 编辑

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



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

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



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

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

使用KELI重定向c库函数printf到串口 :

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

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

                return (int)USART_ReceiveData(USART1);
}


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);



使用特权

评论回复
沙发
chenqianqian| | 2021-10-19 08:08 | 只看该作者
谢谢分享经验

使用特权

评论回复
板凳
zljiu| | 2021-11-5 15:57 | 只看该作者
恩 只跑串口裸机就够了

使用特权

评论回复
地板
drer| | 2021-11-5 15:58 | 只看该作者
还有工程代码啊  不错

使用特权

评论回复
5
aoyi| | 2021-11-5 15:59 | 只看该作者
之前使用的是什么库啊

使用特权

评论回复
6
coshi| | 2021-11-5 16:01 | 只看该作者
超频的话会出现什么现象呢

使用特权

评论回复
7
wiba| | 2021-11-5 16:07 | 只看该作者
可以使用iar吗

使用特权

评论回复
8
zero949079783|  楼主 | 2021-11-5 22:50 | 只看该作者
STM32CubeMX 生成IAR就行了

使用特权

评论回复
9
zero949079783|  楼主 | 2021-11-6 21:45 | 只看该作者
coshi 发表于 2021-11-5 16:01
超频的话会出现什么现象呢

串口乱码,MCU温度有些高

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

79

帖子

1

粉丝