STM32F05x移植GD32F1x0注意事项
来源:互联网 发布:国家大数据行动计划 编辑:程序博客网 时间:2024/05/21 16:55
提要:costdown
前言:本以为能很顺利的移植,结果130这颗芯片虽然是M3的core,实际上外部PIN与GPIO等寄存器结构与M0一致,NVIC部分又与M3一致,简言之,130即有M3的“基因”,也有M0的“基因”,主要这颗芯片是为了与ST的M0芯片抢市场。由于刚上市,所以Library从ST M0的Library基础稍作修改。寄存器名称虽然不一样,但是实际地址与功能是完全一样。下面重点列出在移植过程中,我遇到的问题:
A0:在Keil中,Device选型:
A0:GD32f130c6应当选择STM32F101C6/8,因为该系列寄存器与GD130最接近。左图为100,右图为101,实际130的SPI包含I2SCFGR与I2SPR寄存器。
另外使用STLINK读取的Device,如图:
Q1、EXTI中断无效?
A1:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);SYSCFG_EXTILineConfig(PWR_EXTI_PORT_SOURCE, PWR_EXTI_PIN_SOURCE);
其中在操作SYSCFG寄存器时,必须先使能SYSCFG的CLK,这个问题在M0上也是一样的,但是我在移植过程中,忽略了这点。
导致花了一些时间才找到这个问题。找类似这种bug,两方面着手,一用硬件仿真,看外设寄存器是否与预设一直;二设置完后直接串口打印出来。
Q2、NVIC配置部分需要增加下面两句,M0无此配置,M3则有。
A2:
/* NVIC configuration for priority grouping */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*定位中断向量表*/NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
另外中断优先级配置因为有组的概念,所以也有所不同,如;
STM32F051:
<span style="font-family: Arial, Helvetica, sans-serif;">NVIC_InitStructure.NVIC_IRQChannelPriority = 0x03; //0x03,与IRRec保持一致</span>
GD130:
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
Q3、EXTI在handler mode进入stop mode后不能唤醒,在thread mode中进入可以唤醒?
A3:
如果在Handler mode进入STOP mode,需要唤醒,则唤醒源的中断优先级必须必进入stop mode的handler 优先级更高。否则同级或更低级的中断无法唤醒,除非退出中断。这也是在thread mode进入可以被唤醒的原因。如在timer2中进入stopmode,在exti按键唤醒。demo:
static void PWR_NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;/* Enable the EXTIx global Interrupt */NVIC_InitStructure.NVIC_IRQChannel = PWR_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); }static void TIM2_NVIC_Configuration(void){ NVIC_InitTypeDef NVIC_InitStructure;/* Enable the TIM global Interrupt */NVIC_InitStructure.NVIC_IRQChannel = KEY_TIM_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}
Q4:SPI寄存器区别:
A4:SPIx_CR1 Bit11,051中该bit(CRCL)是CRC length,130是FF16(FF16)是data frame formate;
SPIx_CR2 bit15-bit8,130中高8位为保留字节,051则有其他定义,如fifo触发值与data size。因此130中没有该库函数:
SPI_RxFIFOThresholdConfig(LT8900SPI, SPI_RxFIFOThreshold_QF); //8bitsize->QF,16bit->HF通讯库函数区别:
M0:
/* Send byte through the SPI1 peripheral */SPI_SendData8(LT8900SPI, *pu32Data);/* Wait to receive a byte */while (SPI_I2S_GetFlagStatus(LT8900SPI, SPI_I2S_FLAG_RXNE) == RESET);/* Return the byte read from the SPI bus */return SPI_ReceiveData8(LT8900SPI);GD130:
/* Send byte through the SPI1 peripheral */SPI_I2S_SendData(LT8900SPI, *pu32Data);/* Wait to receive a byte */while (SPI_I2S_GetFlagStatus(LT8900SPI, SPI_I2S_FLAG_RXNE) == RESET);/* Return the byte read from the SPI bus */return SPI_I2S_ReceiveData(LT8900SPI);
Q5:使用HSE时,有效采样数的区别:
A5:
ST#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */GD130:#define HSE_STARTUP_TIMEOUT ((uint16_t)0x5000) /*!< Time out for HSE start up */
Q6:中断向量表区别,GD兼容051,但又涵盖M3的中断入口。另外051不支持自定义中断入口偏移地址。
A6:
/* 自动重定位中断向量表 *///NVIC_SetVectorTable(NVIC_VectTab_FLASH, (BaseOfROM - NVIC_VectTab_FLASH)); //CM0不支持该功能Q7:GPIO区别:
A7:虽然130为M3,但是GPIO部分与M0的寄存器结构完全一致。
Q8:Flash区别:
A8:虽然130为M3,但是Flash部分与M0结构大概相同,包含对OB区域的读写与读保护等级,多了一个烧断功能,此时不能还原为保护或无保护状态。
加读保护功能与M0一致,在使用JLink Flash中使用去除读保护是,device必须选择STM32F101系列,否则去除保护功能无效。
但有部分寄存器位有所不同,如:
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; //M3不支持该设置
A9:M0中只有APB总线给外设提供CLK,但是M3中分了两组不同的CLK对应不同的外设,分别为APB1,APB2。如下:
M0:
uint32_t SYSCLK_Frequency; uint32_t HCLK_Frequency; uint32_t PCLK_Frequency; uint32_t ADCCLK_Frequency;/* PCLK = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
GD130:
uint32_t SYSCLK_Frequency; /*!< returns SYSCLK clock frequency expressed in Hz */ uint32_t HCLK_Frequency; /*!< returns HCLK clock frequency expressed in Hz */ uint32_t PCLK1_Frequency; /*!< returns PCLK1 clock frequency expressed in Hz */ uint32_t PCLK2_Frequency; /*!< returns PCLK2 clock frequency expressed in Hz */ uint32_t ADCCLK_Frequency; /*!< returns ADCCLK clock frequency expressed in Hz <span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span>
/* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
Q10:ID读取位置:
Flashsize位置不同,130与M3一致,但UID却与M0一致。如:
M0:
#define rFlashSizeReg(*((uint16_t *)(0x1ffff7cc)))#define Stm32_UIDBase(uint8_t *)(0x1ffff7ac)GD130:
#define rFlashSizeReg(*((uint16_t *)(0x1ffff7e0)))#define Stm32_UIDBase(uint8_t *)(0x1ffff7ac)
Q11:电源特性区别:
A11:
(1)工作电压2.6-3.6V,待机时电流为250uA;;
(2)由于mcu启动功耗大于st,因此mcu稳压电容验证将1uF改为47uF,解决上电瞬间电流过大,电源特性不稳定,电压输出被拉低至2V被强制关机问题;
如下图:
(1)进入stopmode休眠后,sensorpwr关闭,中断唤醒后启动,下图为电源端与sensorpwr端电压图形。GD32端稳压电容为1uF。
同样由于上电瞬间电压不稳导致无法启动芯片,区别图(3)。
(2)进入stopmode休眠后,sensorpwr关闭,中断唤醒后启动,下图为电源端与sensorpwr端电压图形。STM32端稳压电容为1uF。
3、GD130睡眠后被外部中断唤醒的SensorPwr,SensorPwr端加47uF稳压电容,可以正常启动,但是睡眠后唤醒会出现电压过低关机的现象。
(4)进入stopmode休眠后,sensorpwr关闭,中断唤醒后启动,下图为电源端与sensorpwr端电压图形。GD32端稳压电容为47uF,Sensor端为1uF电容。
综上,由于GD32启动电压较ST高0.6V,导致开机或休眠被唤醒瞬间电压不稳导致关机,图中多次启动是因为按键开关抖动导致多次触发。
(5)待机功耗,如图:
- STM32F05x移植GD32F1x0注意事项
- 移植注意事项
- linux->windows移植注意事项
- 数据库移植注意事项
- Android移植注意事项
- tslib1.4移植注意事项
- secureCRT 移植注意事项
- LWIP 移植 stm32 注意事项
- GP数据移植注意事项
- oracle移植到mysql注意事项
- lgui移植到s3c2440注意事项
- oracle移植到mysql注意事项
- pushserver不同内核移植注意事项
- oracle移植到mysql注意事项
- busybox的移植及注意事项
- 移植LwIP到RTOS注意事项
- android bluetooth 移植相关注意事项
- android bluetooth 移植相关注意事项
- SharePoint集成Excel数据和Excel Web Access Web部件
- Java正则表达式
- 阅读者之JAVA小记---关于编程学习的一些经验
- 什么是object?
- Java工具类
- STM32F05x移植GD32F1x0注意事项
- JNI入门程序
- 【最讨厌那些不开源的】小米的米UI的BOTTOMVIEW源码完美反编译
- 邓白氏编码 苹果证书申请完的感受
- 克隆JS对象的三个实用方法
- Unix/Linux环境C编程入门教程(11) 开发环境搭建VMWare虚拟安装之虚拟化检测
- Visual Studio代码字体
- 2010-11-01 22:04 Codewarrior for HCS12的中断服务程序编写说明
- 在 R 中安装 XML包 报错 cannot find xml2-config