我用的是开发环境是KEIL MDK,版本号是uVision V5.24.2.0,目前最高的版本应该是5.25.0。关于MDK的安装与建立工程这里就不再赘述了,网上有一大把的文章,写重复也没有啥意义。我是直接在例程上改的工程。
我手里的开发板处理器是MM32F103,原例程目录太深,我把工程目录拷了出来,所以MDK中,关于头文件的包含路径也要做相应的修改,同时根据自己的习惯,对MDK做了一些处理。MDK的整体配置如下所示:
图1 选择正确的元件图2 关于ROM与RAM的选择这一页暂时按默认选项来设置,后面有会专门抽空来研究这款MCU的内存的说明,另外,我勾选上了“Use Micro LIB”这个选项。关于这个选项简单说明一下:
“Use Micro LIB”是MDK自带的一处简易的库,例如在用到printf这个函数时,就会从串口1输出字符串,直接默认定向到串口1
Microlib是缺省C库的备选库,它用于必须在极少量内存环境下运行的深层嵌入式应用程序,这些应用程序不在操作系统中运行。Microlib不会尝试成为符合标准的ISO库
Microlib进行了高度优化以使代码变得很小,它的功能比缺省C库少,并且根本不具备某些ISO C特性,某些库函数的运行速度比较慢,例如memcpy()
图3 输出选项中,一定要自己建立一个文件夹用来保存MDK修改了那么多版本,居然不提供自己建立文件夹,也真够蛋疼。
图4 关于list文件,同样建个文件夹,方便工程管理与清除图5 因为对工程文件夹进行了修改,所以头文件路径要进行修改图6 ASM暂时用默认选项即可图7 Linker选项中也用默认的选项即可图8 选择自己用的是仿真器,我用的是ulink图9 选择下载程序用的驱动为了查看代码方便,还是建立一个sourceInsight工程吧,程序员必备的查看代码的神器,如果没用过sourceInsight的同学可以面壁去了^_^
图10 建立的sourceInsight工程
这次研究的是UART_DMA的工程,简单的看了一下代码,与STM32F的工程比较类似,不过例程写的有点不符合我的风格,所以我简单的修改了一下,加上了注释,如下所示:
- /*********************************************************************************
- * Copyright (C) 2000-2018 Mark Xu Work Studio,All Rights Reserved.
- *
- * 文件名称 : main.c
- *
- * 文件描述 : 关于main相关的一些API
- *
- * 文件作者 :Mark Xu
- *
- * 文件备注 :None
- ---------------------------------------------------------------------------------
- * 修改记录 :
- *
- * 修改日期 : xxxx/xx/xx/ xx:xx
- *
- * 修改人员 :xx xx
- *
- * 修改内容 : 1) ...
- **********************************************************************************/
- #define MAIN_IMPLATION
- #include "stdint.h"
- //#include "delay.h"
- #include "sys.h"
- #include "uart.h"
- #include "dma.h"
- /*********************************************************************************
- * 常量声明
- **********************************************************************************/
- // 串口波特率
- #define UART_BUAD_RATE_DEFAULT (115200)
- // 发送缓冲 大小
- #define TEXT_LENTH (9)
- /*********************************************************************************
- * 本地变量声明
- **********************************************************************************/
- static int32_t TEXT_TO_SEND[] = {'1','2','3','4','5','6','7','8','9'};
- static uint8_t SendBuff[(TEXT_LENTH+2)*100];
- /*********************************************************************************
- * 函数名称 : Board_Init
- *
- * 函数描述 : 板子接口初始化
- *
- * 入口参数 : None
- *
- * 出口参数 : None
- *
- * 函数备注 : None
- ***********************************************************************************/
- void Board_Init(void)
- {
- // // 延时函数初始化
- // delay_init();
- // 串口初始化为115200
- uart_initwBaudRate(UART_BUAD_RATE_DEFAULT);
- //DMA1通道4,外设为串口1,存储器为SendBuff,长(TEXT_LENTH+2)*100.
- MYDMA_Config(DMA1_Channel4,(u32)&UART1->TDR,(u32)SendBuff,(TEXT_LENTH+2)*10);
- }
- /*********************************************************************************
- * 函数名称 : Uart_Send_Test
- *
- * 函数描述 : 串口测试
- *
- * 入口参数 : None
- *
- * 出口参数 : None
- *
- * 函数备注 : 测试专用,死等传输完成
- ***********************************************************************************/
- void Uart_Send_Test(void)
- {
- uint8_t t = 0;
- printf("\r\nDMA DATA:\r\n");
- // 填充ASCII字符集数据
- for(uint16_t i=0; i<(TEXT_LENTH+2)*100; i++)
- {
- // 加入换行符
- if(t >= TEXT_LENTH)
- {
- SendBuff[i++] = 0x0d;
- SendBuff[i] = 0x0a;
- t = 0;
- }
- else
- {
- // 复制TEXT_TO_SEND语句
- SendBuff[i]=TEXT_TO_SEND[t++];
- }
- }
- // 使能uart1 DMA
- UART_DMACmd(UART1,UART_DMAReq_EN,ENABLE);
- // 开始一次DMA传输
- MYDMA_Enable(DMA1_Channel4);
- //等待DMA传输完成
- while(1)
- {
- // 等待通道4传输完成
- if(DMA_GetFlagStatus(DMA1_FLAG_TC4) != RESET)
- {
- // 清除通道4传输完成标志
- DMA_ClearFlag(DMA1_FLAG_TC4);
- break;
- }
- }
- printf("\r\nUART DMA TEST OK!\r\n ");
- }
- /*********************************************************************************
- * 函数名称 : main
- *
- * 函数描述 : 主程序入口
- *
- * 入口参数 : None
- *
- * 出口参数 : None
- *
- * 函数备注 : None
- ***********************************************************************************/
- int main(void)
- {
- // 硬件接口初始化
- Board_Init();
- // 测试串口发送
- Uart_Send_Test();
- while(1);
- }
复制代码
这是我的风格
好吧,这编辑器不太给力,还是看附件的内容吧
1_MM32F103_Uart - 2018年10月23日 141724.rar
(3.42 MB, 下载次数: 14)
此内容由EEWORLD论坛网友懒猫爱飞原创,如需转载或用于商业用途需征得作者同意并注明出处