STM8L Exploration Kit Study Notes - Comprehensive Application (XVIII)

Publisher:科技探险者Latest update time:2015-12-21 Source: eefocusKeywords:STM8L Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere
There are many peripherals used today, including DMA, TIM1, and ADC. Channel 24 of ADC1, namely PF1, is used to collect the voltage of the potentiometer, and is transferred to the buffer by channel 0 of DMA1. At the same time, channel 2 of DMA1 transfers the buffer to the TIM1 peripheral, namely the TIM1_CCR1H register, which can change the duty cycle of the PWM wave. We connect the PWM output end to LED3 on the board, so that the brightness of LED3 can be adjusted by the potentiometer. We took such a big detour, but we were able to learn a lot. Here is the code:
void main(void)
{
  //1 Enable clock
  /* Enable ADC1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
 
  /* Enable TIM1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, ENABLE);
 
  /* Enable DMA1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  //2 Set up ADC
  /* Initialise and configure ADC1 */
  ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_2);
  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
 
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
 
  /* Enable ADC1 Channels 24 */
  ADC_ChannelCmd(ADC1, ADC_Channel_24, ENABLE); /* connected to potentiometer */
  //3 Set DMA channel 0 to connect to ADC1, channel 2 to connect to TIM1
  /* Connect ADC1 to DMA1 channel 0 */
  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1 ToChannel0);
  DMA_Init(DMA1_Channel0,
           BUFFER_ADDRESS,
           ADC1_DR_ADDRESS,
           BUFFER_SIZE,
           DMA_DIR_PeripheralToMemory, DMA_Mode_Circular
           ,
           DMA_MemoryIncMode_Inc,
           DMA_Priority_High,
           DMA_MemoryDataSize_HalfWord);
 
  /* Connect DMA1 channel 2 to TIM1 */
  DMA_Init(DMA1_Channel2,
           BUFFER_ADDRESS,
           TIM1_CCR1_ADDRESS,
           BUFFER_SIZE,
           DMA_DIR_MemoryToPeripheral,
           DMA_Mode_Circular,
           DMA_MemoryIncMode_Inc,
           DMA_Priority_High,
           DMA_MemoryDataSize_HalfWord);
 
  /* DMA1 Channel0 enable */
  DMA_Cmd(DMA1_ Channel0, ENABLE);
 
  /* DMA1 Channel2 enable */
  DMA_Cmd(DMA1_Channel2, ENABLE);
 
  /* DMA1 enable */
  DMA_GlobalCmd(ENABLE);
  //4Set TIM1 CH1 to output PWM wave
  /* configure TIM1 channel 1 as PWM Output */
  TIM1_OC1Init(TIM1_OCMode_PWM1,
               TIM1_OutputState_Enable,
               TIM1_Out putNState_Disable,
               0x7FF/* TIM1_Pulse */,
               TIM1_OCPolarity_Low,
               TIM1_OCNPolarity_Low,
               TIM1_OCIdleState_Reset,
               TIM1_OCNIdleState_Reset);
 
  /* Set TIM1 Autoreload value*/
  TIM1_SetAutoreload(0xFFF);
  //2M/4095=488.4HZ
  /* Enable TIM1 */
  TIM1_Cmd(ENABLE);
 
  //5 PD2 TIM1 CH1设置
  /* GPIO configuration: TIM1 channel 1 (PD2)*/
  GPIO_Init(GPIOD, GPIO_Pin_2 , GPIO_Mode_Out_PP_Low_Fast);
 
  //6 使能
  /* Enable TIM1 Outputs*/
  TIM1_CtrlPWMOutputs(ENABLE);
 
  /* Enable ADC1 DMA requests*/
  ADC_DMACmd(ADC1, ENABLE);
 
  /* Enable TIM1 DMA requests*/
  TIM1_DMACmd(TIM1_DMASource_Update, ENABLE);
 
  /* Start ADC1 Conversion using Software trigger*/
  ADC_SoftwareStartConv(ADC1);
 
  while (1)
  {}
}
Keywords:STM8L Reference address:STM8L Exploration Kit Study Notes - Comprehensive Application (XVIII)

Previous article:STM8L Study Notes - Unique Device ID (19)
Next article:STM8L Exploration Kit Study Notes - Window Watchdog WWDG (Seventeen)

Latest Microcontroller Articles
  • Download from the Internet--ARM Getting Started Notes
    A brief introduction: From today on, the ARM notebook of the rookie is open, and it can be regarded as a place to store these notes. Why publish it? Maybe you are interested in it. In fact, the reason for these notes is ...
  • Learn ARM development(22)
    Turning off and on interrupts Interrupts are an efficient dialogue mechanism, but sometimes you don't want to interrupt the program while it is running. For example, when you are printing something, the program suddenly interrupts and another ...
  • Learn ARM development(21)
    First, declare the task pointer, because it will be used later. Task pointer volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • Learn ARM development(20)
    With the previous Tick interrupt, the basic task switching conditions are ready. However, this "easterly" is also difficult to understand. Only through continuous practice can we understand it. ...
  • Learn ARM development(19)
    After many days of hard work, I finally got the interrupt working. But in order to allow RTOS to use timer interrupts, what kind of interrupts can be implemented in S3C44B0? There are two methods in S3C44B0. ...
  • Learn ARM development(14)
  • Learn ARM development(15)
  • Learn ARM development(16)
  • Learn ARM development(17)
Change More Related Popular Components
Guess you like

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号