AURIX TC2XX 学习笔记(2) 系统定时器(STM)

1.模块简介

STM模块有以下特点:

•支持自由运行的64位计数器

支持64位同步读取

•支持不同的32位计数器同步读取64位的STM

•支持比较寄存器进行灵活的定时中断服务请求

STM(System Timer)是一个向上的64位计数器,运行频率为fSTM(最高100MHz)。如果应用程序复位,STM会被重置(在STMxDIS标志位已被清除的情况下)。重置后,STM会自动启用,并立即开始计数。在正常操作过程中,不会影响定时器的内容,定时器寄存器只能被读取而不能被写入。

由于STM的64位宽度,因此不可能用一条指令读取其整个内容。它需要用两个加载指令来读取。为了能够同步地读取STM内容,使用了捕获寄存器(CAP)。每次读取寄存器TIM0到TIM5中的一个时,它都会锁存STM高32部分的内容。因此,当读取定时器的低部时,CAP保持定时器的高部值。然后,第二个读取操作将读取CAP的内容以获得完整的计时器值。

2.Compare Register Operation(比较寄存器)

STM中每个模块提供了两个32位比较寄存器,用来实现单次定时的功能。64位系统定时器STM的值可以与CMP0和CMP1寄存器中存储的两个比较值进行比较。当比较值匹配时可以生成服务请求,用于触发中断。

有两个参数用于比较操作:

  1. START(开始):进行比较操作所用的第一位(LSB)位置。
  2. SIZE(大小):要进行比较的位数(从零开始)。

MSIZE0 = 10001B = 17; MSTART0 = 01010B = 10

MSIZE1 = 00111B = 7; MSTART1 = 00111B = 7

在上图的例子中,比较寄存器CMP0[17:0]加上十个右扩展的零位与STM[27:0]进行比较,STM[9:0] = 000H。最简单的操作方式就是直接将开始位置(STAR)设置为0,这样比较寄存器的比较值跟STM值的分辨率一样,定时多少时间就是多少。这种比较简单也比较常用。

3.Compare Match Interrupt Control(比较匹配中断控制)

STM 的中断触发机制并不复杂,每个 STM 模块有两个比较寄存器,同时每个 STM 模块有两个中断源,而且比较寄存器和中断源的连接也是可配的。功能示意图如下:

 每个比较寄存器都有其比较匹配中断请求标志位(ICR.CMPxIR),该标志由硬件在比较匹配事件上设置。中断请求标志可以通过软件设置(ISSR.CMPxIRS)或清除(ISSR.CMPxIRR)。如果设置ICR将1写入CMPxIRS不会在STMIRx上产生中断。来自CMP0和CMP1的比较匹配中断可以由CMPxOS选择输出信号STMIR0或STMIR1。CMPxOS 设置为 0 或者 1 则选择对应的中断源,输出到中断模块 IR 中。

4.STM部分寄存器解读

4.1Compare Match Control Register(比较匹配控制寄存器)

 

上面提到的操作比较寄存器的两个参数就由这个寄存器来配置。

4.2Interrupt Control Register(中断控制寄存器)

CMP0IR(比较寄存器CMP0中断请求标志):该位表示比较寄存器CMP0的比较匹配中断请求是否正在等待,CMP0IR必须通过软件清除。

0:由于上次清除了该位,所以没有检测到比较匹配中断。

1:检测到比较匹配中断。CMP0IR必须通过软件清除,也可以通过软件设置(参见CMPISCR寄存器)。

4.3Interrupt Set/Clear Register(中断设置/清除寄存器)

CMP0IRS CMP0IR位已经设置,在这种情况下,位CMP0IRR的状态为“不关心”。 

5.代码功能实现

下列代码使用定时器模块,实现定时器延时函数功能,并用延时函数实现流水灯效果。

 

  

<think>嗯,用户想了解如何在STM32中使用IO口和DMA配合进行高效的数据传输。我需要先回顾一下DMA的基本原理和在STM32中的应用。DMA,直接存储器访问,可以让外设和内存之间直接传输数据,不需要CPU介入,这样能提高效率,减少CPU负担。 首先,用户可能需要一个配置的示例,所以应该给出具体的步骤。比如,使用STM32CubeMX进行配置,或者直接通过寄存器配置。考虑到现在大多数开发者使用HAL库或者CubeMX,可能以CubeMX为例更合适。 然后,需要确定使用哪个外设和GPIO。比如,GPIO的快速数据传输通常涉及将GPIO的输出数据寄存器(ODR)与内存之间的传输。例如,使用DMA将数组中的数据快速发送到GPIO的ODR,实现高速输出。可能涉及到GPIO端口的配置为推挽输出,高速模式。 接下来是DMA的配置,包括数据传输方向(内存到外设)、数据宽度(字节、半字、字)、传输模式(正常或循环)、优先级等。需要确保DMA通道正确映射到对应的GPIO端口。例如,在STM32F1系列中,DMA1的某个通道可能对应GPIOA的ODR。 还需要考虑触发源,DMA传输的触发可能由定时器触发,或者由软件触发。如果是定时器触发,需要配置定时器以特定的频率启动DMA请求,这样可以实现精确的时序控制。 用户可能还需要知道如何编写代码,启动DMA传输,处理传输完成的中断,以及如何验证数据传输是否成功。比如,使用HAL库的函数HAL_DMA_Start,或者在CubeMX生成的代码基础上添加用户逻辑。 此外,可能需要注意的问题,比如DMA和GPIO的时钟使能,GPIO引脚配置是否正确,DMA通道是否正确,中断是否启用,以及内存地址和外设地址是否正确。例如,在STM32中,ODR的地址需要作为外设地址传递给DMA。 还需要引用相关的参考资料,比如AN2548应用笔记,里面详细介绍了DMA控制器的使用,以及用户提到的其他引用内容,如微雪课堂的ADC DMA配置,或者USB例程中的DMA使用案例,可能提供有用的配置思路。 另外,用户可能遇到的问题,比如数据没有传输,可能是DMA配置错误,或者触发源没有正确启动,或者内存缓冲区没有正确设置。需要提醒用户检查这些点,并参考已有的问题解决案例,如STM32H743的ADC DMA配置问题中的解决方案。 最后,生成相关的问题,帮助用户进一步学习,比如性能分析、优化方法、应用场景等。例如,如何分析DMA传输的带宽,使用双缓冲技术,或者DMA在SPI、UART中的应用。</think>### STM32中IO口与DMA配合的高效数据传输配置示例 #### 1. 基本原理 DMA(直接存储器访问)控制器可实现外设与内存间无需CPU干预的数据传输。在IO口场景中,常用于批量输出固定模式数据(如LED流水灯、并行通信)或高速采集输入信号[^1]。 #### 2. 硬件配置示例(基于STM32F1系列) ```c // 目标:通过DMA将数组内容持续输出到GPIOA端口 GPIOA->CRL = 0x33333333; // PA0-PA7配置为推挽输出,50MHz DMA1_Channel1->CCR &= ~DMA_CCR_EN; // 先禁用DMA DMA1_Channel1->CPAR = (uint32_t)&GPIOA->ODR; // 外设地址:GPIO输出寄存器 DMA1_Channel1->CMAR = (uint32_t)data_buffer; // 内存地址:数据缓冲区 DMA1_Channel1->CNDTR = BUFFER_SIZE; // 传输数据量 DMA1_Channel1->CCR = DMA_CCR_MINC | // 内存地址递增 DMA_CCR_DIR | // 内存到外设 DMA_CCR_TCIE | // 传输完成中断 DMA_CCR_CIRC; // 循环模式 DMA1_Channel1->CCR |= DMA_CCR_EN; // 启动DMA ``` #### 3. CubeMX配置流程(HAL库) 1. 启用GPIO端口时钟和DMA控制器时钟 2. 配置GPIO为输出模式(推挽/开漏根据需求) 3. 在DMA配置界面添加新通道: - Direction: Memory To Peripheral - Priority: High - Mode: Circular(循环传输) - Data Width: Word(根据GPIO端口位宽选择) 4. 关联到对应GPIO外设(选择"GPIOx"作为DMA请求源)[^4] #### 4. 关键代码实现 ```c // 定义数据缓冲区 uint32_t pattern[] = {0xAA, 0x55, 0xF0, 0x0F}; // 启动DMA传输 HAL_DMA_Start(&hdma_gpioa, (uint32_t)pattern, (uint32_t)&GPIOA->ODR, sizeof(pattern)/4); // 启用连续传输模式 __HAL_DMA_ENABLE_IT(&hdma_gpioa, DMA_IT_TC); ``` #### 5. 典型应用场景 - LED矩阵快速扫描(PWM调光) - 并行DAC输出波形生成 - 高速数字信号模拟(如WS2812B灯带控制) - 硬件加速的位操作(需要配合位带操作) #### 6. 常见问题排查 1. **数据未输出**:检查DMA时钟使能、GPIO模式配置、DMA触发源 2. **传输不完整**:验证CNDTR寄存器值是否正确,内存对齐是否符合要求 3. **性能不足**:启用DMA双缓冲模式,优化存储器访问(使用TCM内存区域)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值