找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)

[复制链接]
跳转到指定楼层
楼主
ID:505762 发表于 2020-4-16 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm32f0xx_hal.h"
  3. #include "stdbool.h"
  4. #include "string.h"

  5. /* USER CODE BEGIN Includes */

  6. /* USER CODE END Includes */

  7. /* Private variables ---------------------------------------------------------*/
  8. TIM_HandleTypeDef htim2;

  9. UART_HandleTypeDef huart2;

  10. /* USER CODE BEGIN PV */

  11. /* USER CODE END PV */

  12. /* Private function prototypes -----------------------------------------------*/
  13. void SystemClock_Config(void);
  14. static void MX_GPIO_Init(void);
  15. static void MX_TIM2_Init(void);
  16. static void MX_USART2_UART_Init(void);

  17. /* USER CODE BEGIN PFP */
  18. void scheduler( void );
  19. bool serial2_in(uint8_t *pchByte);
  20. bool serial2_out(uint8_t chByte) ;

  21. /* USER CODE END PFP */

  22. /* USER CODE BEGIN 0 */

  23. /* USER CODE END 0 */

  24. int main(void)
  25. {

  26.   /* USER CODE BEGIN 1 */

  27.   /* USER CODE END 1 */

  28.   /* MCU Configuration----------------------------------------------------------*/

  29.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  30.   HAL_Init();

  31.   /* Configure the system clock */
  32.   SystemClock_Config();

  33.   /* Initialize all configured peripherals */
  34.   MX_GPIO_Init();
  35.   MX_TIM2_Init();
  36.   MX_USART2_UART_Init();

  37.   /* USER CODE BEGIN 2 */
  38.     HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  39.         HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
  40.         HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
  41.   /* USER CODE END 2 */

  42.   /* USER CODE BEGIN 3 */
  43.   /* Infinite loop */
  44.   while (1)
  45.   {
  46.         scheduler();
  47.   }
  48.   /* USER CODE END 3 */

  49. }

  50. /** System Clock Configuration
  51. */
  52. void SystemClock_Config(void)
  53. {

  54.   RCC_OscInitTypeDef RCC_OscInitStruct;
  55.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  56.   RCC_PeriphCLKInitTypeDef PeriphClkInit;

  57.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  58.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  59.   RCC_OscInitStruct.HSICalibrationValue = 16;
  60.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  61.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  62.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
  63.   RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
  64.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  65.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  66.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  67.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  68.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  69.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);

  70.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  71.   PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_HSI;
  72.   HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

  73.   __SYSCFG_CLK_ENABLE();

  74. }

  75. /* TIM2 init function */
  76. void MX_TIM2_Init(void)
  77. {

  78.   TIM_MasterConfigTypeDef sMasterConfig;
  79.   TIM_OC_InitTypeDef sConfigOC;

  80.   htim2.Instance = TIM2;
  81.   htim2.Init.Prescaler = 1875;
  82.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  83.   htim2.Init.Period = 256;
  84.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  85.   HAL_TIM_PWM_Init(&htim2);

  86.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  87.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  88.   HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

  89.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  90.   sConfigOC.Pulse = 80;
  91.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  92.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  93.   HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

  94.   sConfigOC.Pulse = 160;
  95.   HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);

  96.   sConfigOC.Pulse = 240;
  97.   HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);
  98.   
  99. }

  100. /* USART2 init function */
  101. void MX_USART2_UART_Init(void)
  102. {

  103.   huart2.Instance = USART2;
  104.   huart2.Init.BaudRate = 9600;//38400;
  105.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  106.   huart2.Init.StopBits = UART_STOPBITS_1;
  107.   huart2.Init.Parity = UART_PARITY_NONE;
  108.   huart2.Init.Mode = UART_MODE_TX_RX;
  109.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  110.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  111.   huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ;
  112.   huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  113.   HAL_UART_Init(&huart2);

  114. }

  115. /** Configure pins as
  116.         * Analog
  117.         * Input
  118.         * Output
  119.         * EVENT_OUT
  120.         * EXTI
  121. */
  122. void MX_GPIO_Init(void)
  123. {

  124.   GPIO_InitTypeDef GPIO_InitStruct;

  125.   /* GPIO Ports Clock Enable */
  126.   __GPIOC_CLK_ENABLE();
  127.   __GPIOF_CLK_ENABLE();
  128.   __GPIOA_CLK_ENABLE();
  129.   __GPIOB_CLK_ENABLE();

  130.   /*Configure GPIO pin : PC13 */
  131.   GPIO_InitStruct.Pin = GPIO_PIN_13;
  132.   GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
  133.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  134.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  135.   /*Configure GPIO pin : PA5 */
  136.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  137.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  138.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  139.   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  140.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  141. }

  142. /* USER CODE BEGIN 4 */

  143. //! \name finit state machine state
  144. //! @{
  145. typedef enum {
  146.     fsm_rt_err          = -1,    //!< fsm error, error code can be get from other interface
  147.     fsm_rt_cpl          = 0,     //!< fsm complete
  148.     fsm_rt_on_going     = 1,     //!< fsm on-going
  149. } fsm_rt_t;
  150. //! @}

  151. static uint8_t analysis_val(uint8_t chValH, uint8_t chValL);
  152. static void adjust(void);
  153. static fsm_rt_t task_receive(void);
  154. static fsm_rt_t task_adjust(void);
  155. static fsm_rt_t task_delay(void);
  156. static fsm_rt_t delay(void);
  157. static bool s_bFlag = false;
  158. static bool s_bRgbUpdataFlag = false;

  159. static uint8_t s_chRVal = 0;
  160. static uint8_t s_chGVal = 0;
  161. static uint8_t s_chBVal = 0;
  162. /****************************************************************************/
  163. /**
  164. * Function Name: void scheduler( void )
  165. * Description: none
  166. *
  167. * Param:   none
  168. * Return:  none
  169. * Author:  
  170. ****************************************************************************/
  171. void scheduler( void )
  172. {
  173.         uint8_t chByte;
  174.     while(!serial2_out('S'));
  175.     while(!serial2_out('m'));
  176.     while(!serial2_out('a'));
  177.     while(!serial2_out('r'));
  178.     while(!serial2_out('t'));
  179.     while(!serial2_out('L'));
  180.         while(!serial2_out('E'));
  181.         while(!serial2_out('D'));
  182.     while(!serial2_out('\r'));
  183.     while(!serial2_out('\n'));
  184.    
  185.     /* loop here forever */
  186.         while(1){   
  187.         //        if (serial2_in(&chByte)) {
  188.     //       serial2_out(chByte);
  189.     //    }
  190.         task_receive();  
  191.                 task_adjust();                
  192.         //task_delay();     
  193.         }
  194.                
  195. }

  196. #define TASK_RECEIVE_RESET_FSM()        \
  197.         do{        \
  198.                 s_tState = START;\
  199.         }while(0)       
  200. static fsm_rt_t task_receive(void)
  201. {
  202.         static uint8_t s_chLedVal[8];
  203.         static uint8_t s_chLedInd = 0;
  204.         static uint32_t s_wReceiveCounter = 0x2ffff;
  205.         static enum{
  206.                 START=0,
  207.                 IDLE,
  208.                 RECEIVE,
  209.                 ANALYSIS
  210.         }s_tState = START;
  211.         switch (s_tState){
  212.                 case START:
  213.                         s_chLedVal[0] = 0x00;
  214.                 s_chLedVal[1] = 0x00;
  215.                 s_chLedVal[2] = 0x00;
  216.                 s_chLedVal[3] = 0x00;
  217.                 s_chLedVal[4] = 0x00;
  218.                 s_chLedVal[5] = 0x00;
  219.                 s_chLedVal[6] = 0x00;
  220.                 s_chLedVal[7] = 0x00;
  221.                
  222.                         s_chLedInd = 0;
  223.                         s_wReceiveCounter = 0x2ffff;
  224.                         s_tState = IDLE;
  225.                
  226.                 case IDLE:
  227.                         if(serial2_in(&s_chLedVal[s_chLedInd])){
  228.                                 if('*'==s_chLedVal[s_chLedInd]){/*'*' is start mark*/
  229.                                         s_chLedInd++;
  230.                                         s_tState = RECEIVE;
  231.                                 }else{
  232.                                         s_tState = IDLE;
  233.                                 }
  234.                         }
  235.                         break;
  236.                        
  237.                 case RECEIVE:
  238.                         if(serial2_in(&s_chLedVal[s_chLedInd])){                               
  239.                                 if('#'==s_chLedVal[s_chLedInd]){/*'#' is end mark*/
  240.                                         if(7 == s_chLedInd){/*verify length */
  241.                                                 s_tState = ANALYSIS;
  242.                                         }else{
  243.                                                 s_tState = START;
  244.                                         }                                       
  245.                                 }
  246.                                 s_chLedInd++;
  247.                         }
  248.                         /*time out*/
  249.                         s_wReceiveCounter--;
  250.                         if(0 == s_wReceiveCounter){
  251.                                 TASK_RECEIVE_RESET_FSM();
  252.                         }
  253.                         break;
  254.                        
  255.                 case ANALYSIS:
  256.                         s_chRVal = analysis_val(s_chLedVal[1],s_chLedVal[2]);
  257.                         s_chGVal = analysis_val(s_chLedVal[3],s_chLedVal[4]);
  258.                         s_chBVal = analysis_val(s_chLedVal[5],s_chLedVal[6]);
  259.                         s_bRgbUpdataFlag = true;
  260.                         TASK_RECEIVE_RESET_FSM();
  261.                         return fsm_rt_cpl;
  262.         }
  263.         return fsm_rt_on_going;
  264. }

  265. static uint8_t analysis_val(uint8_t chValH, uint8_t chValL)
  266. {
  267.         uint8_t chVal = 0;
  268.         if((chValH >= 48) && (chValH <= 57)){/*'0'~'9'*/
  269.                 chVal = (chValH-48)<<4;
  270.         }else if((chValH >= 65) && (chValH <= 70)){/*'A'~'F'*/
  271.                 chVal = (chValH-55)<<4;
  272.         }
  273.        
  274.         if((chValL >= 48) && (chValL <= 57)){/*'0'~'9'*/
  275.                 chVal |= chValL-48;
  276.         }else if((chValH >= 65) && (chValH <= 70)){/*'A'~'F'*/
  277.                 chVal |= chValL-55;
  278.         }
  279.        
  280.         return chVal;
  281. }

  282. #define TASK_ADJUST_RESET_FSM()        \
  283.         do{        \
  284.                 s_tState = START;\
  285.         }while(0)
  286. static fsm_rt_t task_adjust(void)
  287. {
  288.         static enum{
  289.                 START=0,
  290.                 IDLE,
  291.                 ADJUST
  292.         }s_tState = START;
  293.         switch(s_tState){
  294.                 case START:
  295.                         s_tState = IDLE;
  296.                
  297.                 case IDLE:
  298.                         if(s_bRgbUpdataFlag){
  299.                                 s_bRgbUpdataFlag = false;
  300.                                 s_tState = ADJUST;
  301.                         }
  302.                         break;
  303.                
  304.                 case ADJUST:
  305.                         adjust();
  306.                         while(!serial2_out('O'));
  307.                         while(!serial2_out('K'));
  308.                         while(!serial2_out('\r'));
  309.                         while(!serial2_out('\n'));
  310.                         TASK_ADJUST_RESET_FSM();
  311.                         return fsm_rt_cpl;
  312.         }
  313.        
  314.         return fsm_rt_on_going;
  315. }

  316. static void adjust(void)
  317. {
  318.         TIM_OC_InitTypeDef sConfigOC;
  319.        
  320.         sConfigOC.OCMode = TIM_OCMODE_PWM1;
  321.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  322.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  323.         sConfigOC.Pulse = s_chRVal;
  324.         HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

  325.         sConfigOC.Pulse = s_chGVal;
  326.         HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);

  327.         sConfigOC.Pulse = s_chBVal;
  328.         HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);
  329.        
  330.         HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  331.         HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
  332.         HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
  333. }

  334. #define TASK_DELAY_RESET_FSM()        \
  335.         do{        \
  336.                 s_tTaskDelayState = TASK_DELAY_START;        \
  337.         }while(0)       
  338. static  fsm_rt_t task_delay(void)
  339. {
  340.         static enum{
  341.                 TASK_DELAY_START=0,
  342.                 TASK_DELAY_ING
  343.         }s_tTaskDelayState = TASK_DELAY_START;
  344.         switch(s_tTaskDelayState){
  345.                 case TASK_DELAY_START:
  346.                         s_bFlag = false;
  347.                
  348.                 case TASK_DELAY_ING:
  349.                         if(fsm_rt_cpl == delay()){
  350.                                 s_bFlag = true;
  351.                                 TASK_DELAY_RESET_FSM();
  352.                                 return fsm_rt_on_going;
  353.                         }
  354.         }
  355.         return fsm_rt_on_going;
  356. }

  357. #define DELAY_RESET_FSM()        \
  358.         do{        \
  359.                 s_tDelaytState = DELAY_START;        \
  360.         }while(0)
  361. #define DEALY_TIME (0xff)
  362.        
  363. static fsm_rt_t delay(void)
  364. {
  365.         static enum{
  366.                 DELAY_START = 0,
  367.                 DELAY
  368.         }s_tDelaytState = DELAY_START;
  369.         static uint32_t s_wDelayCounter = 0;
  370.         switch(s_tDelaytState){
  371.                 case DELAY_START:
  372.                         s_wDelayCounter = 0;
  373.                         s_tDelaytState = DELAY;

  374.                 case DELAY:
  375.                         s_wDelayCounter ++;
  376.                         if(s_wDelayCounter > DEALY_TIME){       
  377.                                 s_wDelayCounter = 0;                               
  378.                                 DELAY_RESET_FSM();
  379.                                 return fsm_rt_cpl;
  380.                         }
  381.                         break;
  382.         }                       
  383.         return fsm_rt_on_going;
  384. }

  385. bool serial2_out(uint8_t chByte)
  386. {
  387.     bool bUartState;
  388.         if(HAL_UART_Transmit(&huart2,&chByte,1,10) == HAL_OK){
  389.                 bUartState = true;
  390.         }else{
  391.                 bUartState = false;
  392.         }
  393.     return bUartState;
  394. }

  395. bool serial2_in(uint8_t *pchByte)
  396. {
  397.     bool bUartState;
  398.     if(0 == pchByte){
  399.          bUartState = false;
  400.     }else{
  401.         if(HAL_UART_Receive(&huart2,pchByte,1,0x1fffff) == HAL_OK){
  402.                         bUartState = true;
  403.                 }else{
  404.                         bUartState = false;
  405.                 }
  406.         }
  407.     return bUartState;
  408. }
  409. /* USER CODE END 4 */

  410. #ifdef USE_FULL_ASSERT

  411. /**
  412.    * @brief Reports the name of the source file and the source line number
  413.    * where the assert_param error has occurred.
  414.    * @param file: pointer to the source file name
  415.    * @param line: assert_param error line source number
  416.    * @retval None
  417.    */
  418. void assert_failed(uint8_t* file, uint32_t line)
  419. {
  420.   /* USER CODE BEGIN 6 */
  421.   /* User can add his own implementation to report the file name and line number,
  422.     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  423.   /* USER CODE END 6 */

  424. }

  425. #endif

  426. /**
  427.   * @}
  428.   */

  429. /**
  430.   * @}
  431. */

  432. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码


基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发).7z

4.93 MB, 下载次数: 6, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:1 发表于 2020-4-17 16:48 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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