STM32F103C8T6 DMA流水灯:高速控制PA4-PB0引脚
STM32F103C8T6 DMA高速流水灯控制
本文介绍如何使用STM32F103C8T6的DMA功能控制PA4、PA5、PA6、PA7、PB0引脚输出高低电平,并在主循环中实现高速流水灯效果。
原理
- 使用GPIO_Init()函数将PA4、PA5、PA6、PA7、PB0配置为输出模式。* 选择一个DMA通道,配置为内存到外设模式,传输数据大小为1字节。* 将GPIO输出寄存器的地址设置为DMA目标地址。* 将高低电平数据存储在一个数组中,作为DMA传输数据源。* 使用DMA_Cmd()函数启动DMA传输。* 在主循环中,通过位操作将数组中的数据写入GPIO输出寄存器,实现流水灯效果。
代码示例c#include 'stm32f10x.h'
#define LED_COUNT 5#define LED_GPIO_PORT GPIOA#define LED_GPIO_PIN_1 GPIO_Pin_4#define LED_GPIO_PIN_2 GPIO_Pin_5#define LED_GPIO_PIN_3 GPIO_Pin_6#define LED_GPIO_PIN_4 GPIO_Pin_7#define LED_GPIO_PIN_5 GPIO_Pin_0
uint8_t led_data[LED_COUNT] = {0x01, 0x02, 0x04, 0x08, 0x10};
void GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN_1 | LED_GPIO_PIN_2 | LED_GPIO_PIN_3 | LED_GPIO_PIN_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN_5; GPIO_Init(GPIOB, &GPIO_InitStructure);}
void DMA_Configuration(void){ DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&LED_GPIO_PORT->ODR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)led_data; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = LED_COUNT; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 修改为 Byte DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 修改为循环模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel3, &DMA_InitStructure); DMA_Cmd(DMA1_Channel3, ENABLE);}
int main(void){ GPIO_Configuration(); DMA_Configuration();
while (1) { // 无需在主循环中操作LED,DMA自动完成 }}
说明
- 将
DMA_PeripheralDataSize设置为DMA_PeripheralDataSize_Byte可以确保每次传输一个字节的数据,对应一个LED灯的状态。* 将DMA_Mode设置为DMA_Mode_Circular可以让DMA传输完成后自动重新开始,实现连续的流水灯效果。* 主循环中无需再进行LED操作,DMA会自动完成数据传输和流水灯控制。
总结
通过以上步骤,可以使用STM32F103C8T6的DMA功能实现高速流水灯控制,简化代码并提高效率。
原文地址: https://www.cveoy.top/t/topic/fNoV 著作权归作者所有。请勿转载和采集!