[AT32F407] 从STM32F407到AT32F407

[复制链接]
 楼主| LEDyyds 发表于 2024-8-14 10:28 | 显示全部楼层 |阅读模式
雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。

我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输出正常。

            于是决心修改一下,时钟配置。主要参考《STM32f4xx中文参考手册.PDF》和RM_AT32F435-F437_CH_V2.03.pdf 。

主要问题出现在RCC PLL配置寄存器(RCC_PLLCFGR)

STM32F4XX的RCC PLL配置寄存器
6877966bc160173c82.png
8622566bc160b7d8c8.png
AT32F407RCC PLL配置寄存器
7363166bc161ba8a79.png

可以看到    PLL_P    只能是4/8/16/32

#define PLL_P      4 //定义为4

看到了他们的配置不同,下面开始修改代码

(1)修改SystemInit()函数。

  1. void SystemInit(void)
  2. {
  3.   /* FPU settings ------------------------------------------------------------*/
  4.   #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  5.     SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  6.   #endif
  7.   /* Reset the RCC clock configuration to the default reset state ------------*/
  8.   /* Set HSION bit */
  9.   RCC->CR |= (uint32_t)0x00000001;

  10.   /* Reset CFGR register */
  11.   RCC->CFGR = 0x00000000;

  12.   /* Reset HSEON, CSSON and PLLON bits */
  13.   RCC->CR &= (uint32_t)0xFEF6FFFF;

  14.   /* Reset PLLCFGR register */
  15.         //RCC->PLLCFGR = 0x24003010;
  16.   RCC->PLLCFGR = 0x00033002;//AT32F437

  17.   /* Reset HSEBYP bit */
  18.   RCC->CR &= (uint32_t)0xFFFBFFFF;

  19.   /* Disable all interrupts */
  20.   RCC->CIR = 0x00000000;

  21. #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  22.   SystemInit_ExtMemCtl();
  23. #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
  24.          
  25.   /* Configure the System clock source, PLL Multiplier and Divider factors,
  26.      AHB/APBx prescalers and Flash settings ----------------------------------*/
  27.   SetSysClock();

  28.   /* Configure the Vector Table location add offset address ------------------*/
  29. #ifdef VECT_TAB_SRAM
  30.   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  31. #else
  32.   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  33. #endif
  34. }

修改配置寄存器初始值,防止硬件错误。

2.修改SetSysClock()中的配置代码

  1. //stm32f407  原代码
  2. /* Configure the main PLL */
  3.     RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  4.                    (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

  5.    
  6. //修改成如下代码
  7. /* Configure the main PLL */
  8.     RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 2) +1) << 16) |
  9.                    (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

3.修改  RCC_GetClocksFreq()和void SystemCoreClockUpdate(void)函数



  1. 将原代码:
  2. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) +1 ) *2;
  3. 改成如下代码
  4. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) -1 )* 4;

4. 修改延时函数,我目前的时钟是336MHZ

   delay_init(336);        //延时初始化

经这样修改,串口输出和延时输出正常工作。


tpgf 发表于 2024-9-3 10:44 | 显示全部楼层
从STM32F407到AT32F407的迁移需要进行一系列的代码修改和配置调整,主要涉及时钟、外设配置和系统初始化等
观海 发表于 2024-9-15 18:33 | 显示全部楼层
SystemInit函数负责初始化系统的时钟源和PLL参数,需要针对AT32F407进行相应的修改
八层楼 发表于 2024-9-17 10:09 | 显示全部楼层
在STM32F407和AT32F407中,时钟配置存在一些差异
heimaojingzhang 发表于 2024-9-18 16:18 | 显示全部楼层
对于AT32F407,需要确保系统时钟源配置正确,包括PLL源选择、系统时钟分频等。这通常在SystemInit()函数中进行设置
keaibukelian 发表于 2024-9-20 20:09 | 显示全部楼层
尽管STM32F407和AT32F407在很多外设上是相似的,但具体的外设配置和功能可能会有所不同。例如,定时器数量、通信接口、ADC分辨率等可能存在差异
guanjiaer 发表于 2024-9-21 20:59 | 显示全部楼层
修改SetSysClock()函数中的PLL配置代码,确保主PLL的正确配置。这一步骤非常关键,因为PLL配置直接影响系统的运行频率和稳定性
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

867

帖子

1

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