|
MCU:STM32F103RCT6
我想使用定时器6+DAC1输出一个1.1KHz,占空比为50%的方波
定时器6进入中断一次是高,再进入一次是低电平,大概就是这样,但是波形一直不对,而且频率是1.333KHz
下图是我的中断代码,本来用的if else写的,结果都一样
void TIM6_IRQHandler(void)
{
static int dac1 = 0;
if (TIM_GetITStatus(TIM6,TIM_IT_Update)!= RESET)
{
DAC_SetChannel1Data(DAC_Align_12b_R,wave_data[dac1]);
dac1++;
if(dac1 == 2)dac1=0;
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
}
}
下图是定时器的初始化
void TIM6_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 719; //1000
TIM_TimeBaseStructure.TIM_Prescaler = 43; //32 * 2
// TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //基本定时器无此项
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;/*重复计数寄存器*/
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ClearFlag(TIM6,TIM_FLAG_Update);/*清更新标志位*/
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);/*使能中断*/
TIM_Cmd(TIM6,ENABLE); //使能TIM6计数器
}
下面是DAC的初始化
void Dac1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );//打开GPIOA
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );//打开DAC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //设置PA4为DAC输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4) ;
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能,软件触发
// DAC_InitType.DAC_Trigger=DAC_Trigger_T6_TRGO;
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭
DAC_Init(DAC_Channel_1,&DAC_InitType); //
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1
DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
// DAC_SetChannel1Data(DAC_Align_12b_R, 0);
}
最后示波器的波形是这样的,有没有大佬指导一下,真的不知道问题在哪,好像定时器会自己进入中断一次,不知道怎么触发的
main函数里也很简单就初始化了一下DAC和定时器
|
|