|
实验介绍
开发平台:官方STM32H743 NUCLEO板子
开发环境:MDK5.25正式版
软件版本:
(1)CMSIS软件包 V5.3.0
(2)H7的HAL库版本 V1.2.0
例程说明:
DMA使用的memory空间使能了Cache的话,空间要做32位字节对齐。同时为了保持数据一致性
1、AXI RAM空间MPU直接设置为WT模式。
2、DMA接收后,使用函数SCB_InvalidateDCache_by_Addr做接收缓冲区无效化。
正常情况下,二选一即可,实际测试都不选也能使用,估计是没有被Cache缓存,如果缓存了的话,要注意。
例程下载:
实验14:STM32H743串口DMA方式.7z
(1.09 MB, 下载次数: 2437)

- #if 1
- ALIGN_32BYTES(__attribute__((section (".RAM_D2"))) uint8_t aRxBuffer[5]) = "ARM";
- #else
- __attribute__((section(".RAM_D2"))) uint8_t tt= 20;
- __attribute__((section(".RAM_D2"))) uint8_t aRxBuffer[13] = "KEY_DOWN_K1\r\n";
- #endif
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main(void)
- {
- uint8_t ucKeyCode; /* 按键代码 */
-
-
- bsp_Init(); /* 外设初始化 */
-
- bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 */
-
- HAL_UART_Receive_DMA(&UartHandle, aRxBuffer, 5);
- while (1)
- {
- bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
- if (bsp_CheckTimer(0)) /* 判断定时器超时时间 */
- {
- /* 每隔100ms 进来一次 */
- bsp_LedToggle(1);
- }
-
- if(g_ucRecieveFlag == 1)
- {
- g_ucRecieveFlag = 0;
- bsp_LedToggle(3);
-
- /* 设置新的接收,并将接收到发送回去 */
- /* CPU访问前,将Cache对应的区域无效化 */
- SCB_InvalidateDCache_by_Addr ((uint32_t *)aRxBuffer, 5);
- HAL_UART_Transmit_DMA(&UartHandle, aRxBuffer, 5);
- HAL_UART_Receive_DMA(&UartHandle, aRxBuffer, 5);
- }
-
- /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
- ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
- if (ucKeyCode != KEY_NONE)
- {
- switch (ucKeyCode)
- {
- case KEY_DOWN_K1: /* K1键按下 */
- HAL_UART_Transmit_DMA(&UartHandle, aRxBuffer, 13);
- bsp_LedToggle(2);
- break;
- case KEY_UP_K1: /* K1键弹起 */
- bsp_LedToggle(2);
- break;
- case KEY_LONG_K1: /* K1长按 */
- printf("K1按键长按\r\n");
- break;
- default:
- /* 其它的键值不处理 */
- break;
- }
- }
- }
- }
复制代码
|
|