STM32F103C8T6 DMA控制PA4PA5PA6PA7PB0高低电平并在主循环里面进行流水灯变换要求速度最快
要实现STM32F103C8T6 DMA控制PA4,PA5,PA6,PA7,PB0高低电平,并在主循环里进行流水灯变换,可以按照以下步骤进行操作:
-
配置GPIO引脚:将PA4,PA5,PA6,PA7,PB0引脚配置为输出模式,通过GPIO_Init()函数进行配置。
-
配置DMA通道:选择一个可用的DMA通道,将其配置为内存到外设模式,并设置传输数据的大小为1字节。通过DMA_Init()函数进行配置。
-
配置DMA传输地址:将GPIO输出寄存器的地址作为DMA的目标地址。
-
配置DMA传输数据:将要传输的数据(高低电平)存储在一个数组中。
-
启动DMA传输:通过DMA_Cmd()函数启动DMA传输。
-
在主循环中进行流水灯变换:使用一个变量来控制当前点亮的灯,通过位操作将该变量的值写入到GPIO输出寄存器,实现流水灯效果。
下面是一个示例代码,可以参考使用:
#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_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
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)
{
for (int i = 0; i < LED_COUNT; i++)
{
LED_GPIO_PORT->ODR = led_data[i];
for (int j = 0; j < 500000; j++); // 延时
}
}
}
请注意,以上代码仅为示例,具体实现还需要根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/h65f 著作权归作者所有。请勿转载和采集!