2019-01-27 06:35 PM
The chip I am using is STM32F100C8T6.
I want to generate a sine wave with 40Khz between 0 to 2V ,but I cant't get correct frequency.
I have finished reading STM32F100 datasheet (RM0041) and AN3126,AN4566. After that,I am writing a program based on the files. what mistake did i make?
1.AN3126 sinewave equation:
fsineware = 40Khz ,ns=20 ftimertrgo = 40K*20 =800Khz
2. ftimertrgo equation:
Ttimertrgo= (1/ftimertrgo) = (TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK
TIMxCLK =24Mhz, Set TIM_Period=9, get TIM_Prescaler=2:
3.Oscilloscope 13.33Khz the frequency is wrong
4.code
void Rcc_init(void)
{
RCC_DeInit();
RCC_HSICmd(ENABLE);
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_6);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}
RCC_HCLKConfig(RCC_SYSCLK_Div1);//24M
RCC_PCLK1Config(RCC_HCLK_Div1); //24M
RCC_PCLK2Config(RCC_HCLK_Div1); //24M
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08){}
}
else
{
}
}
/*sine table*/
uint16_t sine_20p[] ={
1242,1644,2003,2280,2444,2478,2377,2154,1832,1445,
1036, 650, 328, 104, 4, 38, 202, 478, 838,1241
};
void DAC_init(void)
{
DAC_InitTypeDef DAC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
DAC_DeInit();
DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
DAC_InitStruct.DAC_Trigger = DAC_Trigger_T6_TRGO;
DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_Init(DAC_Channel_1, &DAC_InitStruct);
DAC_SetChannel1Data(DAC_Align_12b_R,0);
DAC_DMACmd(DAC_Channel_1,ENABLE);
DAC_ITConfig(DAC_Channel_1,DAC_IT_DMAUDR,ENABLE);
NVIC_Configuration_DAC();
}
void DAC_DMA_Wave(void)
{
DMA_InitTypeDef DMA_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_InitStruct.DMA_BufferSize = 20;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
DMA_InitStruct.DMA_MemoryBaseAddr = ((uint32_t)sine_20p);
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)(&(DAC->DHR12R1));
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ;
DMA_InitStruct.DMA_Priority = DMA_Priority_VeryHigh;
DMA_Init(DMA1_Channel3,&DMA_InitStruct);
DMA_Cmd(DMA1_Channel3,ENABLE);
}
void NVIC_Configuration_DAC(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = TIM6_DAC_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
}
void TIM6_TRGO_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 9;
TIM_TimeBaseInitStruct.TIM_Prescaler =2;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);
TIM_SelectOutputTrigger(TIM6,TIM_TRGOSource_Update);
TIM_ClearFlag(TIM6,TIM_FLAG_Update);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM_Cmd(TIM6,ENABLE);
}
void TIM6_DAC_IRQHandler(void)
{
volatile int i=0;
if(DAC_GetFlagStatus(DAC_Channel_1,DAC_FLAG_DMAUDR) ==SET)
{
}
DAC_ClearITPendingBit(DAC_Channel_1,DAC_IT_DMAUDR);
}
Solved! Go to Solution.
2019-01-27 06:43 PM
Don't wait for HSE startup when using HSI. HSI clock should already be running.
2019-01-27 06:43 PM
Don't wait for HSE startup when using HSI. HSI clock should already be running.
2019-01-27 07:25 PM
Thanks, I get it . Thanks for your help, you do gave me a big favor.
result:
fix code:
void Rcc_init(void)
{
RCC_DeInit();
RCC_HSICmd(ENABLE);
//if(RCC_WaitForHSEStartUp()==SUCCESS)
{
//RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_6);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}
RCC_HCLKConfig(RCC_SYSCLK_Div1);//24M
RCC_PCLK1Config(RCC_HCLK_Div1); //24M
RCC_PCLK2Config(RCC_HCLK_Div1); //24M
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08){}
}
// else
// {
//
// }
}
2019-01-27 07:27 PM
Thanks, I get it . Thanks for your help, you do gave me a big favor.
result:
fix code:
void Rcc_init(void)
{
RCC_DeInit();
RCC_HSICmd(ENABLE);
//if(RCC_WaitForHSEStartUp()==SUCCESS)
{
//RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_6);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}
RCC_HCLKConfig(RCC_SYSCLK_Div1);//24M
RCC_PCLK1Config(RCC_HCLK_Div1); //24M
RCC_PCLK2Config(RCC_HCLK_Div1); //24M
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08){}
}
// else
// {
//
// }
}