本人使用 寄存器版本的开发板
dma.c中函数如下
#include "sys.h"
u8 table1[8]={0,1,2,3,4,5,6,7};
void dma_usart1_init(void)
{
RCC->AHBENR|=1<<0; //开启DMA1时钟
DMA1_Channel4->CPAR=(u32)&USART1->DR; //配置外设地址USART1
DMA1_Channel4->CMAR=(u32)&table1; //配置存储器地址
DMA1_Channel4->CCR|=1<<7; //开启存储器增量模式
DMA1_Channel4->CCR|=1<<4; //开启从存储器读模式
DMA1_Channel4->CCR|=1<<1; //允许传输完成中断
DMA1_Channel4->CNDTR=8; //传输有效位是8
DMA1_Channel4->CCR|=1<<0; //允许通道4传输
MY_NVIC_Init(2,3,DMA1_Channel4_IRQChannel,2);
}
void DMA1_Channel4_IRQHandler(void)
{
//因为只允许传输完成中断这里就不查询了
USART1->CR3&=~(1<<7); //关闭 USART1的DMA发送
DMA1_Channel4->CCR&=~(1<<0); // 关闭通道4传输
DMA1_Channel4->CNDTR=8; //重新设定传输有效位是8
DMA1->IFCR|=1<<14; //除能通道4TIF中断
DMA1->IFCR|=1<<12;//除能通道4全局中断
DMA1->IFCR&=~(1<<13); //消除 通道4 TIF除能事件
DMA1->IFCR&=~(1<<12);//消除 通道4全局中断 除能事件
DMA1_Channel4->CCR|=1<<0; //允许通道4传输
}
主函数如下
#include <stm32f10x_map.h>
#include"sys.h"
#include"delay.h"
#include"usart.h"
#include"timer.h"
#include"key.h"
#include"dma.h"
int main()
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
KEY_Init();
dma_usart1_init();
while(1)
{
if(KEY1==0)
{
delay_ms(10);
if(KEY1==0)
{
USART1->CR3|=1<<7; //使能DMA发送
while(!KEY1);
}
}
}
}
无法进入DMA中断啊,不知道程序哪错了求问原子哥
|