STM32F03--DMA传输
【晒心得】STM32F03--DMA传输
——BY qinkaiabc
在前面串口传输的基础上,以DMA方式传输串口发送的数据。
- #include "stm32f0xx.h"
- #define USART_DR_Base 0x40013828
- #define SENDBUFF_SIZE 500
- uint8_t Tx_Buffer[SENDBUFF_SIZE];
- uint16_t i;
- //uint8_t Tx_Buffer[SENDBUFF_SIZE] = "EEWORLD-[晒心得]STM32F03--USART";
- //#define count(a) (sizeof(a)/sizeof(*(a)))
- /*配置DMA中断配置*/
- void NVIC_Config()
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;//DMA1_Channel4_5_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
- NVIC_Init(&NVIC_InitStructure);
- }
- /*配置DMA*/
- void DMA_Config()
- {
- DMA_InitTypeDef DMA_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- /*配置DMA中断配置*/
- NVIC_Config();
- /*传输大小*/
- DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
- /*方向:从内存到外设*/
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
- /*禁止内存到内存的传输*/
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- /*内存地址:要传输变量的指针*/
- DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Tx_Buffer;
- /*内存数据单位8bit*/
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- /*内存地址自增*/
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- /*DMA模式:一次传输*/
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- /*设置DMA源:串口数据寄存器地址*/
- DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_Base;
- /*外设数据单位*/
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- /*外设地址不增*/
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- /*优先级:中*/
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
- /*配置DMA1的2通道*/
- DMA_Init(DMA1_Channel2, &DMA_InitStructure);
- /*使能DMA*/
- DMA_Cmd(DMA1_Channel2, ENABLE);
- /*配置DMA发送完成后产生中断*/
- DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
- }
- /*串口初始化配置 */
- void USART_Config(void)
- {
- USART_InitTypeDef USART_InitStructure;
- /*初始化USART1时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- USART_InitStructure.USART_BaudRate = 9600;//设置串口波特率
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//设置流控制
- USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//设置工作模式
- USART_InitStructure.USART_Parity = USART_Parity_No;//设置效验位
- USART_InitStructure.USART_StopBits = USART_StopBits_1;//设置停止位
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
- USART_Init(USART1, &USART_InitStructure);
- USART_Cmd(USART1, ENABLE);//使能串口 1
- }
- /*GPIOA初始化配置 */
- void GPIOA_Config()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /*初始化GPIOA时钟*/
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
- /* 配置PA9 ,PA10*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置端口复用
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void UART_send_byte(uint8_t byte)
- {
- while(!((USART1->ISR)&(1<<7)));
- USART1->TDR=byte;
- }
- void UART_Send(uint8_t *Buffer, uint32_t Length)
- {
- while(Length != 0)
- {
- while(!((USART1->ISR)&(1<<7)));
- USART1->TDR= *Buffer;
- Buffer++;
- Length--;
- }
- }
- void LED_Init()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /*!< GPIO Input Mode */
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- int main(void)
- {
- LED_Init();
- GPIOA_Config();
- USART_Config();
- DMA_Config();
- //UART_Send( Tx_Buffer, count(Tx_Buffer)-1);
- for(i=0;i<sendbuff_size;i++)
</sendbuff_size;i++) - {
- Tx_Buffer=0xf5;
- }
- /*串口数据由DMA传输*/
- USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
- /*点亮LED,传输完后DMA中断关闭LED*/
- GPIO_SetBits(GPIOC, GPIO_Pin_8);
- while(1)
- {
- }
- }
[color=rgb(51, 102, 153) !important]复制代码
#define USART_DR_Base 0x40013828 -》》》 0x40013828 = 0x40013800 + 0x28
串口1的外设基地址加上发送数据寄存器的地址偏移,就是DMA外设基地址:DMA_PeripheralBaseAddr
DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_Base;
STM32F03--DMA.zip (192.58 KB, 下载次数: 7)
谢谢分享谢谢分享谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享 谢谢分享谢谢分享谢谢分享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 分 分
谢谢分享 谢谢分享 享 享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢 谢谢分享 谢谢分享 分 分
谢谢 谢谢分享 谢谢分享 享 享
谢谢分 谢谢分享 谢谢分享 谢 谢
谢谢分 谢谢分享 谢 谢
谢谢分谢谢分享 谢 谢
谢谢谢谢 分 分
谢谢 享 享