本帖最后由 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);
|