新手入门
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2011-5-5
- 在线时间
- 0 小时
|
stm32 各种 进不了中断,受不了了
先初始化,自己写的一些函数,跟原子写的功能一样
#include <stm32f10x_lib.h>
#include <stm32f10x_map.h>
cdz_rcc_init(9);
cdz_usart_init(72,9600);
cdz_dma_config(4,(u16)sizeof(string),(u32)&(USART1->DR),(u32)string);
cdz_nvic_config(3,3,14,2); //14 是DMA1通道4 的中断号
cdz_led_init();
在一系列的初始化以后,程序运行的主体如下
这个是用DMA1 的通道4 发串口数据的程序
while(1)
{
if(DMA->ISR&(0x00002000))
{
DMA->IFCR|=1<<13;
DMA->CHANNEL[3].CCR&=0xfffffffe; // 我把DMA的数据结构重新定义了一下,这里的DMA->CHANNEL[3].CCR 就是dma1 通道4 的CCR,最低位清零 停止DMA
cdz_delay_ms(1500);
LED0=~LED0;
DMA->CHANNEL[3].CCR|=0x01;
}
}
这里我把DMA的数据结构重新定义了一下,定义如下,
typedef struct
{
vu32 ISR;
vu32 IFCR;
struct
{
vu32 CCR;
vu32 CNDTR;
vu32 CPAR;
vu32 CMAR;
vu32 RESERVED;
}CHANNEL[7];
}mydma_type;
上述程序运行时可以得到想要的结果,就是灯 1.5秒闪一次并且向串口发了一串字符串,每1.5秒循环一次,那个循环里有个判断 if(DMA->ISR&(0x00002000)) 等于说DMA相关中断的标志位已被置位。
在函数 cdz_nvic_config(3,3,14,2); 里也已使能 通道14 也就是DMA通道4 的中断
照理说 把上面那个while循环里的代码移到 DMA1 通道4的中断服务函数中也会得到同样效果,为啥就不行呢??
void DMAChannel4_IRQHandler()
{
if(DMA->ISR&(0x00002000))
{
DMA->IFCR|=1<<13;
DMA->CHANNEL[3].CCR&=0xfffffffe;
cdz_delay_ms(1500);
LED0=~LED0;
DMA->CHANNEL[3].CCR|=0x01;
}
}
除了开启相应通道的中断也就是 NVIC->ISER[] ,还有 相关的中断标志位被置位外,进入中断还需不需要其他条件???
|
|