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配置:

  1. 右键当前工程:

在这里插入图片描述
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方可查看地址内容。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐