STM32H7 USART 时钟初始化
使用芯片 STM32H750XB,板子使用的是 安富莱的 stm32-V7 开发板。
时钟配置
整体功能把握
USART 的时钟源可以来自于 usart_ker_ck 和 usart_pclk:
usart_ker_ck 和 usart_pclk 的来源由下图可知:
以 USART1 为例,我们需要控制 USART16SEL 来选择第一级输入的时钟源。然后再由 USART1EN 和 USART1LPEN 来控制第二级的输出。
实际上,控制第二级的最多可有五个变量:PERxEN、PERxLPEN、PERxAMEN、CPU_state 和 D3_state。
PERxEN、PERxLPEN 和 PERxAMEN 是控制位用于控制时钟输出,CPU_state 是 CPU 的状态位,D3_state 是域的状态位,它们组合起来一起控制某个外设的时钟是否有效。
还是以 USART1 为例,我们分析《STM32H750XB参考手册》中的内容:
RCC_APB2ENR 寄存器中有一个控制 USART1 的 PERxEN 位,被命名为 USART1EN:
RCC_APB2LPENR 寄存器中有一个控制 USART1 的 PERxLPEN 位,被命名为 USART1LPEN:
这里我们就能看出 RCC_APB2LPENR 和 RCC_APB2ENR 的区别了,前者控制着 CPU 在睡眠模式下,后者控制这个 USART1 外设是否使能。PERxAMEN 这个控制变量对于 USART1 这个外设来说是没有的,其属于低功耗的外设使用,是位于 D3 域的外设才有。其功能和 RCC_APB2ENR、RCC_APB2LPENR 差不多,当 D3 处于 CStop 模式时,控制该外设是否正常工作。
了解了上面三个控制位,CPU_state 和 D3_state 的作用就很明显了。
第一级的时钟来源与配置可以参考
使用 CubeMX 配置 RCC 时钟_Bin Watson的博客-CSDN博客
实战配置
有了上面的了解我们大致知道怎么配置一个 USART 外设的时钟了:
- (配置第一级输入的时钟源)我们需要根据使用的时钟配置 USARTxSEL,以 USART1 为例就是配置 USAT16SEL,选择使用的时钟;
- (配置第二级输入控制)设置 PERxLPEN 和 PERxAMEN 两个控制位,控制 USART 在何种情况下会休眠;
- 设置 PERxEN 启动 USART;
static void InitHardUart(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;/* 下面这个配置可以注释掉,预留下来是为了方便以后选择其它时钟使用 默认情况下,USART1和USART6选择的PCLK2,时钟100MHz。USART2,USART3,UART4,UART5,UART6,UART7和UART8选择的时钟是PLCK1,时钟100MHz。*/RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART16; /* 第一级配置 */RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2; /* 第二级配置 */HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);#if UART1_FIFO_EN == 1 /* 串口1 *//* 使能 GPIO TX/RX 时钟 */USART1_TX_GPIO_CLK_ENABLE();USART1_RX_GPIO_CLK_ENABLE();/* 使能 USARTx 时钟 */USART1_CLK_ENABLE(); /* 启动 USART1 */...
}
如上,我们设置 USAT16SEL 让其使用 D2PCLK2 作为输入时钟。没有设置 PERxLPEN 则说明使用默认的跟随 CPU 休眠。
第 21 行 USART1_CLK_ENABLE()
设置了 PERxEN 位:
#define USART1_CLK_ENABLE() __HAL_RCC_USART1_CLK_ENABLE()#define __HAL_RCC_USART1_CLK_ENABLE() do { \__IO uint32_t tmpreg; \SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\/* Delay after an RCC peripheral clock enabling */ \tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\UNUSED(tmpreg); \} while(0)
USART 发送与接收的实现可以参考 使用RS485芯片进行串口通讯 这篇文章,大体上是实现是相同的,不同的点在于不通过 RS485 进行收发的话,我们只需要直接控制 USART 的收发,而不需要使用回调来控制 RS485 的工作模式。
STM32H7 USART 时钟初始化相关推荐
- 【嵌入式开发】时钟初始化 ( 时钟相关概念 | 嵌入式时钟体系 | Lock Time | 分频参数设置 | CPU 异步模式设置 | APLL MPLL 时钟频率设置 )
文章目录 一. 时钟相关概念解析 1. 相关概念术语 ( 1 ) 时钟脉冲信号 ( 概念 : 电压幅度 时间间隔 形成脉冲 | 作用 : 时序逻辑基础 间隔固定 根据脉冲数量可计算出时间 ) ( 2 ...
- 02 ARM11 时钟初始化后的跑马灯程序
2019独角兽企业重金招聘Python工程师标准>>> .text .globl _start _start:ldr r0, =0x70000000orr r0, r0, #0x13 ...
- [国嵌攻略][038][时钟初始化]
时钟脉冲信号 按一定的电压幅度,一定的时间间隔连续发出的脉冲信号叫做时钟脉冲信号.用于给处理器和其他硬件提供时钟度量. 时钟脉冲频率 在单位时间内产生的时钟脉冲的个数叫做时间脉冲频率 时钟源分类 1. ...
- bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统. boot阶段 1.关闭影响CPU正常执行的外设 -关闭看 ...
- s3c24xx的时钟初始化
本文出处:http://blogold.chinaunix.net/u3/93291/showart_2071102.html 逢山开路 遇水架桥,今天想自己写个adc的驱动,发现不清楚系统各个模块的 ...
- stm32时钟初始化过程浅析
stm32时钟初始化过程浅析 (大致梳理了一下32启动过程中时钟的初始化过程) 加载main函数之前(启动代码中LDR R0, =__main之前),HCLK总线时钟默认上电是上一次断电前配置的频率 ...
- 时间子系统10_hpet时钟初始化
// 时钟mult :mult/2^shift = ns/cyc // 参考:http://www.bluezd.info/archives/reg_clock_event_device_1 // x ...
- STM32_3 时钟初始化分析
在startup文件中,调用了2个函数,一个是System_Init, 另一个是main. System_Init()在system_stm32f10x.c 这个文件中,先看一下时钟树,再分析一下这个 ...
- arm 跑马灯 linux,02 ARM11 时钟初始化后的跑马灯程序
.text .globl _start _start: ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15, 0, r0, c15, c2, 4 ldr r0, ...
最新文章
- C++ union 使用总结
- C/C++输入输出流
- 数据结构与算法理论概述
- jQuery 历史版本
- go语言strings包
- linux 终端 快捷键
- 书单|VR开发内功修炼书单
- 华硕新主板打开核心显卡开关以支持核心显卡不被屏蔽,然后就可以装核显驱动了
- 计算机统计大数据库,统计数据库
- PHP获取服务器图片并添加水印
- jeDate—选择日期后,再点开重新选择时间,日期会被置为今日日期
- Hyper-v安装和使用
- python 实现模拟鼠标点击器 可运行 附源码
- 【哪吒社区Java技能树 打卡day2】Java学习路线总结(思维导图篇)
- npm项目环境配置时出现报错:Not Found - GET https://registry.npm...
- js获取元素的方法及具体案例
- 施工部署主要不包括_施工部署包括什么?
- 专科学校查重严格还是不严格?
- 数学图形(1.14) 十字星形线
- 点击网页中正常链接结果跳转到天猫淘宝的页面