STM32的一些使用记录
设置完成后,Apply and Close,编译后,在Debug文件夹中可以看到输出的文件。加在某个地方, usart.c 或者 main.c中。工具栏 - project - properties。2. 使用scanf库文件。
目录
1. KEIL
1.1 复位函数
__set_FAULTMASK(1);
NVIC_SystemReset();
1.2 晶振代码部分修改
stm32f10x.h 文件中

代码部分:

修改分频值:

static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/*!< SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/*!< 启用外部高速振荡器 (HSE) */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/*!< 等待 HSE 准备就绪,如果超时则退出 */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/*!< 启用预取缓冲区 */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/*!< Flash 设置为2个等待状态 */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
/*!< HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/*!< PCLK2 = HCLK 一般APB2部分用 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/*!< PCLK1 = HCLK / 2 一般APB1部分用 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
/*!< PLLCLK = HSE * 6 = 72 MHz 8*9=72 6*12=72*/
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL6); //12M*6=72M
/*!< 启用 PLL */
RCC->CR |= RCC_CR_PLLON;
/*!< 等待 PLL 准备就绪 */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/*!< 选择 PLL 作为系统时钟源 */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/*!< 等待 PLL 被用作系统时钟源 */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
else
{ /*!< 如果 HSE 启动失败,应用程序将具有错误的时钟配置。用户可以在此处添加一些代码来处理此错误 */
/*!< 进入无限循环 */
while (1)
{
}
}
}
2. STM32CubeIDE
2.1 使用printf函数
加在某个地方, usart.c 或者 main.c中
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
GETCHAR_PROTOTYPE
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1,(uint8_t *)&ch, 1, 0xFFFF);
if (ch == '\r')
{
__io_putchar('\r');
ch = '\n';
}
return __io_putchar(ch);
}
头文件引用:
#include <stdio.h>
IDE配置:
- 右键当前工程:

2. 使用scanf库文件
2.2 编译输出Hex和Bin文件
工具栏 - project - properties
按照步骤设置:
设置完成后,Apply and Close,编译后,在Debug文件夹中可以看到输出的文件。
2.3 相同代码高亮显示
如下开关打开(按下)则高亮显示相同的代码,关闭则只显示当前选中的部分。

2.4 判断数据开头函数
if(starts_with((char *)usart1_rxsavebuf, “SWWW,”)) //*判断开头
/*字符串处理函数 char数组或者uint8_t数组*/
uint8_t starts_with(const char *src, const char *key)
{
while (*key)
if (*key++ != *src++)
return 0;
return 1;
}
2.5 数据截取及转换函数
SW,12,23,45,87,88,\r\n
if(starts_with((char *)usart5_rxsavebuf, "SW,")) //*判断开头
{
strtok((char *)usart5_rxsavebuf, ","); //接收到的第一个“,”之前的数据 -- SW
p_pedalSmall_roll = strtok(NULL, ","); //12
p_pedalSmall_pitch = strtok(NULL, ","); //23
d_pedalSmall_roll = strtod(p_pedalSmall_roll, &end); //将字符型数据 p_pedalSmall_roll 转换为双精度浮点型数据,下同
d_pedalSmall_pitch = strtod(p_pedalSmall_pitch, &end);
// printf("%s,\r\n", p_pedal1_); //打印接收到的踏板SMALL数值
// printf("%.1f,%.1f\r\n", d_pedalSmall_roll, d_pedalSmall_pitch); //打印接收到的踏板SMALL数值
/*clear*/
}
2.6 代码启动FLASH地址修改
FLASH总大小128K,FLASH起始地址0x08008000 即32K bootloader;

main起始代码增加FLASH地址偏移函数

2.7 支持串口输出中文字符
IDE默认UTF-8编码;
不修改编码模式,在GCC编译器中增加GBK编码方式;
在上图中的 miscellaneous 混合编译中增加 GBK编译指令:
-fexec-charset=GBK
-fexec-charset=GBK
2.8 字体格式及大小修改
windows > preferences

General > Appearance > Color and Fonts >C/C++ > Editor > Text Font

选择相应的字体、字形、大小,确定退出即可;

2.9 创建新工程只有空文件
如下,若在创建新工程时,STMcube为灰色不可选择,唯一可选Empty空文件,此时应检查磁盘剩余空间及软件版本是否需要更新。


3. 其他
3.1 C语言
8位数据的某一位数据取反的做法:
0xAA = 1010 1010
将第3位取反:
data = 0xAA^0x08
data = 0xA2 = 1010 0010
3.2 使用ST_LINK查看MCU地址内容
需要借助 STM32 ST-LINK Utility 或 ST Visual Programmer 软件,打开软件进行连接ST-LINK之前,需要复位MCU方可查看地址内容。
更多推荐



所有评论(0)