打印
[STM32G4]

STM32 G431

[复制链接]
楼主: sj8zw8
手机看帖
扫描二维码
随时随地手机跟帖
21
sj8zw8|  楼主 | 2023-12-26 11:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
对应代码
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

使用特权

评论回复
22
sj8zw8|  楼主 | 2023-12-26 11:48 | 只看该作者
/** Configure the main internal regulator output voltage
/
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
/* Initializes the RCC Oscillators according to the specified parameters

in the RCC_OscInitTypeDef structure.
/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 选择来源
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 开启时钟
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
// 倍频设置
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
RCC_OscInitStruct.PLL.PLLN = 20;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/* Initializes the CPU, AHB and APB buses clocks
*/
// 由系统时钟得到对应总线的时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}

使用特权

评论回复
23
sj8zw8|  楼主 | 2023-12-26 11:48 | 只看该作者
在STM32G431内部结构中,各个模块都是通过总线相连接。Cortex-M4内核相当于心脏,最高频率可达170MHz,它通过总线AHB进行数据交换,AHB分为AHB1和AHB2,AHB1又分为APB1和APB2

使用特权

评论回复
24
sj8zw8|  楼主 | 2023-12-26 11:49 | 只看该作者
4.存储空间
查看内存映射地址:STM32G4系列微控制器参考手册

使用特权

评论回复
25
sj8zw8|  楼主 | 2023-12-26 11:50 | 只看该作者
内存映射:

内存映射分左、右两侧, 左侧是各个资源地址的大致分化,右侧是对左侧的细化
(1)Flash(闪存)
Flash:程序存储器,存储代码的地方 起始地址:0x0800 0000

从地址 0x0800 0000 到 0x0808 0000 ,( 8 0000 )16进制 = ( 524288 )10进制,Flash memory被分配到的空间有 524KB 大小,远大于它本身的 128KB

使用特权

评论回复
26
sj8zw8|  楼主 | 2023-12-26 11:50 | 只看该作者
(2)RAM
RAM: 随机存储器,用于存储数据 ,起始地址:0x2000 0000

RAM分为:SRAM和DRAM

1.SRAM:静态RAM(S指的static),静态指的不需要刷新电路,数据不会丢失,SRAM速度非常快,是目前读写最快的存储设备

2.DRAM:动态RAM(D指的dynamic),动态指的每隔一段时间就要刷新一次数据,才能保存数据,速度也比SRAM慢,不过它比任何的ROM都要快

使用特权

评论回复
27
sj8zw8|  楼主 | 2023-12-26 11:51 | 只看该作者
(3)外设
外设:APB1、APB2、AHB1、AHB2 起始地址:0x4000 0000

小结:

外设起始地址为 0x4000 0000
SRAM起始地址为 0x2000 0000
Flash起始地址为 0x0800 0000

使用特权

评论回复
28
sj8zw8|  楼主 | 2023-12-26 11:52 | 只看该作者
详细的外设地址(在上一页的下一页)

使用特权

评论回复
29
sj8zw8|  楼主 | 2023-12-26 11:52 | 只看该作者
可以依据蓝色字体查看外设对应寄存器分配地址

使用特权

评论回复
30
sj8zw8|  楼主 | 2023-12-26 11:57 | 只看该作者
四、BOOT启动
STM32上电启动后,程序代码从最底层地址0x0000 0000 开始运行 前面知道代码存储在 Flash地址0x0800 0000 中,如何让 0x0000 0000 运行的是 0x0800 0000 中的代码? 存储器地址重映射: 将 0x0800 0000 中的代码映射到 0x0000 0000 中

使用特权

评论回复
31
sj8zw8|  楼主 | 2023-12-26 11:58 | 只看该作者
映射还可以将SRAM, System memory 等地址映射到0X0000 0000处

使用特权

评论回复
32
sj8zw8|  楼主 | 2023-12-26 11:58 | 只看该作者
映射方式的选择由BOOT1,BOOT0决定

使用特权

评论回复
33
sj8zw8|  楼主 | 2023-12-26 11:59 | 只看该作者
STM32G431由于BOOT0接地,所以采用的是从flash启动

使用特权

评论回复
34
sj8zw8|  楼主 | 2023-12-26 11:59 | 只看该作者
所以,单片机程序执行顺序

使用特权

评论回复
35
sj8zw8|  楼主 | 2023-12-26 11:59 | 只看该作者

使用特权

评论回复
36
sj8zw8|  楼主 | 2023-12-26 12:00 | 只看该作者
中断向量表: 嵌套向量中断控制器(Nested Vectored Interrupt Controller),STM32向量中断统一由NVIC管理, NVIC的核心功能:中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能

使用特权

评论回复
37
sj8zw8|  楼主 | 2023-12-26 12:00 | 只看该作者

使用特权

评论回复
38
sj8zw8|  楼主 | 2023-12-26 12:00 | 只看该作者
DCD表示开辟一个字空间,后边的为函数名称,函数入口地址

1.存储堆栈指针位置:先获取堆栈指针位置,告诉CPU,中间变量存储再SRAM中, 从下图可以看到首先获取堆栈指针,然后就跳转到复位中断函数

注:按照目录的排列顺序进行检索,并执行目录中地址所指向的函数

使用特权

评论回复
39
sj8zw8|  楼主 | 2023-12-26 12:00 | 只看该作者
2.复位中断函数入口地址:CPU执行到这里,下一步跳转到复位中断函数
中断复位服务函数

使用特权

评论回复
40
sj8zw8|  楼主 | 2023-12-26 12:01 | 只看该作者
3.复位中断函数:CPU执行到这,先配置时钟,再跳转到主函数

在调用main函数之前先完成了时钟的初始化,再调用main的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则