完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在使用 _setPost 来完成 action () API 控制 DMA 设置时遇到了问题。 DMA1 配置为将字符数据数组复制到 RAM 一次,所选操作完成后将引发中断。 如果成功,CY8CKIT-044 板上的红色 LED 将闪烁。
代码如下所示: void Initialize(void){ uint8 CTRL_TMP; // temporary variable - DMA destination // Configure DMA1-> // transfer 1 byte from data[..] to temporary fixef RAM addres CTRL_TMP DMA1_Start((void *)data, (void *) CTRL_TMP); DMA1_SetNumDataElements(0, sizeof(data)); DMA1_SetPostCompletionActions(0, CYDMA_INVALIDATE); // works //DMA1_SetPostCompletionActions(0, (CYDMA_INVALIDATE | CYDMA_GENERATE_IRQ)); // no interrupt! // set DMA1 post completion actions interrupt handler DMA1_SetInterruptCallback( DMA1InterruptHandler); CyIntEnable(CYDMA_INTR_NUMBER); // enable DMA interrupts CyGlobalIntEnable; }int main(void){ Initialize(); for(;;) { /* Place your application code here. */ }}//==============================================================================// DMA1 interrupt callback handler//==============================================================================void DMA1InterruptHandler(void){ BlinkLED(); //Pin_LED_Write(LED_ON); // turn LED indicator on} 但是,API 调用 DMA1_setPostCompletionActionActionActionActionS () 例如,仅运行一次的指令可以正常运行并成功覆盖对话框设置: DMA1_setPostCompletionActionActions (0,CYDMA_INVALIDATE 但是启用/禁用中断的指令却没有,对话框设置总是会覆盖它: DMA1_setPostCompletionActionActions (0,(CYDMA_INVALIDATE | CYDMA_GENERATE_IRQ); 问:如何通过 API 调用控制 ISR 设置? |
|
相关推荐
2个回答
|
|
我重新调整了一下代码逻辑。是可以正常工作的。我把我的测试代码加载在附件里面。
static void DMA1InterruptHandler(void){ Dma1Complete=1; }#define DESCR0 0#if 1void Initialize(void){ uint8 CTRL_TMP2[256]; // temporary variable - DMA destination DMA1_SetInterruptCallback( DMA1InterruptHandler); // set DMA1 post completion actions interrupt handler DMA1_Start((void *)data, (void *)CTRL_TMP2); DMA1_SetNumDataElements(DESCR0, sizeof(data)); CyIntEnable(CYDMA_INTR_NUMBER); // enable DMA interrupts}#endifint main(void){ Initialize(); CyGlobalIntEnable; for(;;) { if(0u != Dma1Complete) { Pin_LED_Write(!Pin_LED_Read()); Dma1Complete = 0u; } }} |
|
|
|
可以使用STM32的HAL库来控制DMA设置。下面是一个示例代码,用于将字符数据数组复制到RAM并触发中断。
```c // 配置 DMA void DMA_Config(void) { // 使能DMA时钟 __HAL_RCC_DMA1_CLK_ENABLE(); // 配置DMA通道(Channel) hdma.Instance = DMA1_Channel1; hdma.Init.Direction = DMA_MEMORY_TO_MEMORY; // 方向:从内存到内存 hdma.Init.MemInc = DMA_MINC_ENABLE; // 内存增量模式 hdma.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址固定 hdma.Init.Mode = DMA_NORMAL; // 一次只传输一次数据 hdma.Init.Priority = DMA_PRIORITY_LOW; // DMA优先级低 HAL_DMA_Init(&hdma); // 配置DMA中断 HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); // 设置DMA中断优先级 HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); // 使能DMA中断 } // DMA中断处理函数 void DMA1_Channel1_IRQHandler(void) { if (HAL_DMA_GetFlagStatus(&hdma, DMA_FLAG_TC1)) // 检查DMA传输完成标志 { HAL_DMA_ClearFlag(&hdma, DMA_FLAG_TC1); // 清除DMA传输完成标志 // 红色LED闪烁 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } } int main(void) { // 初始化代码 HAL_Init(); SystemClock_Config(); GPIO_Config(); // 初始化DMA DMA_Config(); // 启动DMA传输 HAL_DMA_Start_IT(&hdma, (uint32_t)&data_array, (uint32_t)&RAM_address, ARRAY_SIZE); while (1) { // 主循环 } } ``` 在此示例中,`DMA1_Channel1_IRQHandler`函数是DMA传输完成中断的处理函数。在此函数中,我们可以处理完成后的操作,例如控制LED闪烁等。 请确保在启动DMA之前初始化`data_array`和`RAM_address`变量,以及配置正确的GPIO引脚来控制LED。 此外,还要注意调用`HAL_DMA_Start_IT`函数来启动DMA传输,并启用DMA传输完成中断。在此函数中,第一个参数是DMA句柄,第二个参数是源地址,第三个参数是目的地址,第四个参数是传输数据长度。 希望能帮到你! |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 16:00 , Processed in 0.679312 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号