找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1766|回复: 0
打印 上一主题 下一主题
收起左侧

TIM3-UP_DMA1_chanel3

[复制链接]
跳转到指定楼层
楼主
ID:716413 发表于 2020-8-10 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
转一个帖子,以供参考
1.DMA配置
void DMA_Configuration(void)
{
DMA_InitTypeDef D;  
DMA_DeInit(DMA1_Channel3); //DMA1_3通道初始化U
D.DMA_PeripheralBaseAddr =(u32)&TIM3->CCR1;      //DMA外设基址 TIM3_CCR1_Address
D.DMA_MemoryBaseAddr = (u32)buf;                 //DMA内存基址
D.DMA_DIR = DMA_DIR_PeripheralDST; //DST外设作为数据传送目的地址,SRC则作为源地址
D.DMA_BufferSize = 4;                                   //DMA缓存大小
D.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不增加
D.DMA_MemoryInc = DMA_MemoryInc_Enable;          //内存地址寄存器不增加
D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外存字宽16bit
D.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;              //内存字宽16bit
D.DMA_Mode = DMA_Mode_Normal;  //工作在循环模式
//D.DMA_Mode =DMA_Mode_Circular;
D.DMA_Priority = DMA_Priority_High; //DMA置为高优先级
D.DMA_M2M = DMA_M2M_Disable;                  //不置为内存到内存传输
DMA_Init(DMA1_Channel3, &D);                  //初始化DMA1
DMA_Cmd(DMA1_Channel3, ENABLE);     //DMA1_3使能
}
2.定时器PWM输出配置
u16 buf[4] = {200,400,600,800};
static void GPIO_Config(void)
{                                                         
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);         //TIM3钟源
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB, ENABLE); //GPIOA 配置: TIM3 channel 1 和 2 推挽复用
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM3_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//定时器设置
TIM_TimeBaseStructure.TIM_Period = 999;
//当定时器从0计数到999,即为1000次,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = 0;  //设置预分频:不预分频,即为36MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;        //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//PWM通道1模式设置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;    //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;        
TIM_OCInitStructure.TIM_Pulse = buf[0];
//设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
//当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_Cmd(TIM3, ENABLE); //TIM3使能
TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE);
//TIM3 DMA请求使能,注:TIM3_Update请求对应DMA通道为DMA1_chanel3
}
3.主函数
extern u16 buf[4];
int main()
{
GPIO_Config(); //配置端口
TIM3_Init();  
DMA_Configuration(); //配置DMA
}
可以看到PA6输出低电平占200,400,600,800的脉冲,若D.DMA_Mode=DMA_Mode_Circularl; 则200,400,600,800的脉冲循环出现。
TIM_DMACmd(TIM3, TIM_DMA_Update,ENABLE);TIM_DMA_Update对应通道3,刚开始设置TIM_DMA_CC1对应通道6无法实现本现象,原因未知。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表