system_gd32e10x.c分析

news/2024/11/28 18:46:24/
/*!\brief      setup the microcontroller system, initialize the system\param[in]  none\param[out] none\retval     none
*/
void SystemInit (void)
{/* FPU settings *//* 如果要使用户FPU,则在gd32e10x.h中定义__FPU_PRESENT ,看供应商提供的文档中有关于FPU设置的方法 */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
#endif/* reset the RCU clock configuration to the default reset state *//* Set IRC8MEN bit *//* 下面对复位和时钟单元的部分寄存器进行初始化。这里对RCU_CTL这个寄存器做置位,来启动IRC 8M RC振荡器系统启动的时候就默认用8M的RC振荡器来工作,至于后面时钟怎么选,后面再说。不过想一下前面汇编程序是在system init之前是怎么执行的?比如其中有堆栈的空间SPACE,这个SPACE是怎么做的当时都没有时钟,可能还是要了解一下启动过程 */RCU_CTL |= RCU_CTL_IRC8MEN;/* Reset CFG0 and CFG1 registers */RCU_CFG0 = 0x00000000U;RCU_CFG1 = 0x00000000U;/* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */RCU_CTL &= ~(RCU_CTL_PLLEN |RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN);/* disable all interrupts */RCU_INT = 0x00ff0000U;/* reset HXTALBPS bit */RCU_CTL &= ~(RCU_CTL_HXTALBPS);//高速晶体振荡器(HXTAL)时钟旁路模式/* configure the system clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */system_clock_config();//这里我用的是PLL倍频出的48M,最终调用的system_clock_48m_irc8m,这里其实就是初始化PLL,等待PLL稳定下来提供稳定的时钟源//下面是重点,下面单独说
#ifdef VECT_TAB_SRAMnvic_vector_table_set(NVIC_VECTTAB_RAM,VECT_TAB_OFFSET);
#elsenvic_vector_table_set(NVIC_VECTTAB_FLASH,VECT_TAB_OFFSET);
#endif}

对于RCU部分,可以看下RCU在整个EFM32 芯片中的位置,通过AHB和ARM Cortex-M4进行通信

AHB(Advanced High performance Bus)系统总线,高级性能总线和APB(Advanced Peripheral Bus)外围总线

 

#ifdef VECT_TAB_SRAMnvic_vector_table_set(NVIC_VECTTAB_RAM,VECT_TAB_OFFSET);
#elsenvic_vector_table_set(NVIC_VECTTAB_FLASH,VECT_TAB_OFFSET);
#endif

 

VECT_TAB_SRAM

这里是关于NVIC的一些内容,NVIC (Nested Vectored Interrupt Controller).

这里从上面图中就可以看出NVIC是Cortex-M4内部集成的,注意它和我们经常用到的外部中断控制器EXIT的区别。

这里不多说,只说这里关于宏的选择:

在SPEC上我们看到关于NVIC的说明

 

 

 

 

 

对于硬件上boot0 和boot1的引脚电平,可以选择不同的引导源

 

注意这句话:片上SRAM存储空间的起始地址是0x2000 0000,当他被选择为引导源时,在应用程序初始化代码中,

你必须使用NVIC异常表和偏移寄存器来将向量表重定向到SRAM中。

这里看下我们硬件的选择

 

 

BOOT0是接地,电平是0,所以引导源是主FLash存储器,这个宏应该不要定义,看看代码确实没有定义。

在看代码本身

其中的宏:

 

/* constants definitions */
/* set the RAM and FLASH base address */
#define NVIC_VECTTAB_RAM            ((uint32_t)0x20000000) /*!< RAM base address */
#define NVIC_VECTTAB_FLASH          ((uint32_t)0x08000000) /*!< Flash base address */

RAM的地址被映射为0x20000000

FLash基地址是0x80000000

这里可以对应SPEC上

 

再看

/* Vector Table base offset */

#define VECT_TAB_OFFSET 0x0000 /* This value must be a multiple of 0x200. */

这个是你比如说flash上的偏移地址,前面说的基地址,如果你有bootloader,bootloader的空间是0x200,那么你这里就要把bootloader的偏移给加上,加上之后才是你的APP的最终基地址。

之前在开发的时候,这里默认写的是0x2000,但是我又没有bootloader,导致一直有问题,一旦设置中断就出现问题,但是我当时设置的是外部中断,不知道为什么影响到这里,外部的和内部的NVIC应该在一起的吧,我想

 

后续:

#include "gd32e10x.h" 这个头文件被包含在此Sytem_gd32e10x.c源文件中,注意其中的设置

有的宏是需要在编译器中或者代码中定义的,定义之后才能和你的板子匹配

比如说.h文件中的

/* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined  HXTAL_VALUE#ifdef GD32E103V_EVAL#define HXTAL_VALUE    ((uint32_t)8000000) /*!< value of the external oscillator in Hz */#define HXTAL_VALUE_8M  HXTAL_VALUE#elif defined(GD32E103R_START) || defined(GD32E103C_START) || defined(GD32E103T_START)#define HXTAL_VALUE    ((uint32_t)25000000) /*!< value of the external oscillator in Hz */#define HXTAL_VALUE_25M  HXTAL_VALUE#else#error "Please select the target board type used in your application (in gd32e10x.h file)"#endif
#endif /* high speed crystal oscillator value */

到底用哪个,需要仔细确认的!


http://www.ppmy.cn/news/181362.html

相关文章

GD32学习

1.简介 关于兆易创新GD32的产品&#xff0c;目前在单片机MCU的业务上&#xff0c;GD全部是32bit的单片机&#xff0c;目前GD32的单片机从内核上区分有Cortex-M3、Cortex-M4、Cortex-M23三个系列&#xff0c;其中红色框框为主推系列&#xff1a; 开发调试环境&#xff1a; 支持主…

玩转GD32F3x0开发板 (二)

三 开始编译例程 error: #5: cannot open source input file "RTE_Components.h": No such file or directory 原因&#xff1a;system_gd32f3x0.c中用到的gd32f3x0.h不是来自下面目录&#xff1a; GD32F3x0_Demo_Suites_V2.0.0\GD32F3x0_Firmware_Library\CMSIS…

ogg12.2安装及初始配置

一、配置环境 source target IP地址 192.168.184.220 192.168.184.221 操作系统 oracle linux 6.8 oracle linux 6.8 数据库软件 ORACLE 11.2.0.4 ORACLE 12.2.0.1 实例名…

OGG安装配置

OGG简介&#xff08;GoldenGate&#xff09; OGG 是一种基于日志的结构化数据复制软件 OGG 能够实现大量交易数据的实时捕捉&#xff0c;变换和投递&#xff0c;实现源数据库与目标数据库的数据同步&#xff0c;保持最少10ms的数据延迟。 OGG安装 1. 使用Oracle用户&#xff0…

【GD32】GD32设置看门狗

芯片:GD32F350 运行在8M 目标:启动芯片看门狗,定时喂狗 流程 1.初始化看门狗时钟 2.配置看门狗 3.定时喂狗 1.初始化看门狗时钟 启动用于给看门狗的内部40KHz的时钟 static void irc40k_config(void) {/* enable IRC40K */rcu_osci_on(RCU_IRC40K);/* wait till IRC40K is …

Intel SGX

最近Intel推出的SGX技术对云计算安全保护有重要意义&#xff0c;SGX技术是Intel于2013年在ISCA会议的Workshop HASP中提出的&#xff0c;但只是提出了这一概念和原理&#xff0c;2015年10月第一代支持SGX技术的CPU问世。在这两年间&#xff0c;微软基于SGX模拟器提出了SGX技术两…

windows安装G++编译器

1.验证有无安装gcc winr 调出Run&#xff0c;输入cmd&#xff0c;调出cmd窗口 输入 g -v 2安装 在https://sourceforge.net/projects/mingw/ 下载MinGW,minimalist GUN for windows GUN-Gun’s not unix GCC-GNU Compiler Collection 在MinGW的列表中&#xff0c;勾选希望安装的…

振芯GM7123C:功能RGB转VGA芯片方案简介

1. 概述GM7123是一款频率330MHz的3通道10位高速视频DAC芯片&#xff0c;兼容RS-343A/RS-170标准差分输出&#xff0c;输出电流范围是2mA&#xff5e;26mA。输入兼容TTL电平&#xff0c;内部基准1.23V&#xff0c;单电源3.3V供电&#xff0c;采用LQFP48封装。该芯片可应用于&…