本代码基于STM32F030F4P6,用例为DMA控制串口发送,需要注意以下几点
1、注意串口IO配置,包括IO配置和复用功能选择
2、STM32F030系列的DMA不支持外设到外设,STM32F030只有DMA1,没有DMA2
3、注意不同外设对应不同DMA通道,而且不同芯片的通道也不一定相同,注意看数据手册
直接代码如下:
#include "stm32_lib/inc/stm32f0xx_rcc.h"
#include "stm32_lib/inc/stm32f0xx_gpio.h"
#include "stm32_lib/inc/stm32f0xx_usart.h"
#include "stm32_lib/inc/stm32f0xx_dma.h"
//以下两种地址写法都可以
#define USART1_TDR_Address ((uint32_t)(USART1_BASE+0x28))
//#define USART1_TDR_Address (uint32_t)(&USART1->TDR)
unsigned char hellStr[]={'H','E','L','L','O'};
void RCC_Config(void);
void GPIO_Config(void);
void USART_Config(void);
void DMA_Config(void);
int main(void)
{
SystemInit();
RCC_Config();
GPIO_Config();
USART_Config();
DMA_Config();
//使能DMA通道2,意味着开始传输
DMA_Cmd(DMA1_Channel2,ENABLE);
while (1)
{
}
}
void RCC_Config(void)
{
//时钟配置
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
}
void GPIO_Config(void)
{
//选择引脚
//针对F030F4P6,TX有PA2和PA9可选,RX有PA3和PA10可选,特别注意查看文档是AF多少
//GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
//GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
//引脚设置
GPIO_InitTypeDef PORT_UART1_TX; //定义TX脚,PORT_UART1_TX是自定义名称,可以任意
PORT_UART1_TX.GPIO_Pin = GPIO_Pin_9; //此参数根据上面选择的引脚来定
PORT_UART1_TX.GPIO_Speed = GPIO_Speed_10MHz;
PORT_UART1_TX.GPIO_Mode = GPIO_Mode_AF;
PORT_UART1_TX.GPIO_PuPd = GPIO_PuPd_NOPULL;
//IO初始化
GPIO_Init(GPIOA, &PORT_UART1_TX);
GPIO_InitTypeDef PORT_UART1_RX; //定义RX脚
PORT_UART1_RX.GPIO_Pin = GPIO_Pin_10; //此参数根据上面选择的引脚来定
PORT_UART1_RX.GPIO_Speed = GPIO_Speed_10MHz;
PORT_UART1_RX.GPIO_Mode = GPIO_Mode_AF;
PORT_UART1_RX.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &PORT_UART1_RX);
}
void USART_Config(void)
{
//串口参数配置
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200; //设置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据长度
USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验
USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置流控制
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //设置模式
USART_Init(USART1, &USART_InitStructure);
//使能DMA发送
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//串口1发射 DMA使能
//使能
USART_Cmd(USART1, ENABLE);
}
void DMA_Config(void)
{
//特别注意,对于STM32F030F4P6,USART1_TX对应通道2,注意看数据手册
DMA_DeInit(DMA1_Channel2);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_TDR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)hellStr;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize=5;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel2,&DMA_InitStructure);
}
上一篇:关于STM32F0系列多路ADC单独采样数据相同问题的处理
下一篇:STM32入门学习之ADC(STM32F030F4P6基于CooCox IDE)
推荐阅读最新更新时间:2024-11-17 13:20
推荐帖子
- 哎,msp430写红外解码不成功啊,又不知道问题出在哪,谁能指条明路啊,谢谢了
- 1红外解码子程序如下:a依次储存用户码、用户反码与键数据码、键数据反码2利用P1.7的下降沿触发中断,我写的注释蛮多的,应该很容易看清楚程序思路的3试过几次,就是不知道问题出在哪?先谢过了4定时器时钟选了8m,8分频以后,就是1m了,也就是说:计数一次的时间是1us#includemsp430x14x.h//数组a依次储存用户码、用户反码与键数据码、键数据反码unsignedchara;//a是8位的char型,与各位码的位数相同u
- 江汉大学南瓜 微控制器 MCU
- 我要为几天之后的电子设计大赛设计滤波器,频率比较高
- 论坛中的朋友们大家好,为了几天之后的电子设计大赛,我要设计一个矩形性质比较好的,较高频率的带通滤波器。老师提示我用L,C元件和集成运算放大器来设计,但是我接触到的资料都是RC有源滤波器,频率带宽等等条件不太满足,希望能得到各位的帮助。我要为几天之后的电子设计大赛设计滤波器,频率比较高参差放大器!它可以很好地满足所需。
- 张乡夫 模拟电子
- bq34110无法烧写参数
- 电量计默认参数与实际电池参数不一致,需要通过bqstudio工具与调试器ev2400往电量计写入参数。目前readall是正常,能读取所有的寄存器参数,但是修改参数后执行writeall操作提示noparametermatchedaddress,尝试过点击unseal与unsealfullaccess,但是还是无法写入,写入时电量计处于充电状态。电量计是焊接在自己用得板子上,不是买的evm评估板来调试的,请问可能是什么原因导致参数无法写入bq34110无法烧写参数不
- wenguang123361 电源技术
- 430学习总结
- 430单片机确实和51有些差别,低功耗模式非常适合当前的发展趋势。丰富的时钟选择,及内部和外部资源。都决定了它是一款难学,好用,方便的单片机。强大的功能又对它的稳定性提出了挑战通过自己的学习,以及这几天帮助同学解决其中的问题,我同时对430有了更加深入的认识,下面我也就对它简单做如下总结:430的学习中时钟是一个很重要的模块:首先有3个可选的时钟源.方便MCLK、SMCLK、ACLK的选择。对速度要求不同,选择不同的时钟可以降低功耗。减少不必要的开销。同时内部集成的很多模块丰富
- Widic 微控制器 MCU
- fpga快速系统原型设计权威指南--英文版
- fpga快速系统原型设计权威指南--英文版markmark,看过别人翻译过其中几个章节 特权同学翻译过这本书 对的,好像是谢谢,英文版的,期待中文一看名字就是好书,顶楼主:time:thx
- 白丁 FPGA/CPLD
- 电机控制 - 步进电机概述
- 本帖最后由dontium于2015-1-2313:10编辑电机控制-步进电机概述步进电机是电机家族的“婴儿”,20世纪60年代早期才开始流行。最初构想是作为昂贵的位置控制应用中伺服电机的低成本替代产品,而新兴的计算机工业迅速将其采用到外设应用当中。步进电机的主要优势在于能提供开环位置控制,而成本只是需要反馈的伺服系统的几分之一。欲知更多精彩详情,请速速下载原文一探究竟~~~~电机控制-步进电机概述
- 德州仪器 模拟与混合信号
设计资源 培训 开发板 精华推荐
- DER-750 - 基于HiperPFS-4和LYTSwitch-6的42 W两级升压和隔离反激式可调光LED镇流器
- LT1071、100W 离线式开关稳压器
- LTM4620EY 1.5V @ 26A、具有温度监控功能的两相设计的典型应用电路
- AM2G-0509DZ ±9V 2 瓦 DC-DC 转换器的典型应用
- TA8126SG 3V DC/DC转换器电调典型应用
- 【涂鸦智能】涂鸦智能 温湿度计
- 基于VL53L3CX的多目标测距传感器Nucleo组件
- 具有 12V VDD 输入的 LTC2945IMS-1 3.3V 输入电源监视器的典型应用
- TWR-KW24D512、TWR-KW2x 开发平台连接测试应用演示,使用 MKW24D512V Kinetis KW20 MCU
- EVAL-ADF7012DB2,ADF7012 ISM 频段发射器评估板,单芯片低功耗 UHF 发射器