找回密码
 立即注册

QQ登录

只需一步,快速开始

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

开发的一个STM32灯具控制程序

[复制链接]
跳转到指定楼层
楼主
ID:605477 发表于 2019-8-30 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个灯具控制程序是采用了单片STC的芯片。
非常好用。

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "GLCD.h"
  3. #include "UART.h"
  4. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
  5. vu32 ret; /* for return of the interrupt handling */
  6. volatile TestStatus TestRx;
  7. ErrorStatus HSEStartUpStatus;

  8. TestStatus CAN_Polling(void);
  9. TestStatus CAN_Interrupt(void);

  10. void GPIO_Configuration(void)
  11. {
  12.         GPIO_InitTypeDef GPIO_InitStructure;

  13.           /* Configure PD.02, PD.03, PD.04 and PD.07 as Output push-pull */
  14.           // For STM3210B-LK1 use PD.02 -PC.07
  15.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 ;
  16.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  17.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.           GPIO_Init(GPIOB, &GPIO_InitStructure);

  19.           /* Configure CAN pin: RX */
  20.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  21.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  22.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  23.   
  24.           /* Configure CAN pin: TX */
  25.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  26.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  27.           GPIO_Init(GPIOB, &GPIO_InitStructure);

  28.         GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );           //重影射CAN IO脚到 PB8,PB9
  29. }

  30. //系统中断管理
  31. void NVIC_Configuration(void)
  32. {
  33.         NVIC_InitTypeDef NVIC_InitStructure;

  34.           /* Configure the NVIC Preemption Priority Bits */  
  35.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  36.         #ifdef  VECT_TAB_RAM  
  37.           /* Set the Vector Table base location at 0x20000000 */
  38.           NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  39.         #else  /* VECT_TAB_FLASH  */
  40.           /* Set the Vector Table base location at 0x08000000 */
  41.           NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  42.         #endif

  43.         /* enabling interrupt */
  44.           NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;
  45.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  46.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  47.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  48.           NVIC_Init(&NVIC_InitStructure);
  49. }

  50. //配置系统时钟,使能各外设时钟
  51. void RCC_Configuration(void)
  52. {
  53.         SystemInit();       
  54.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
  55.                            |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
  56.                            |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
  57.                                                    |RCC_APB2Periph_ADC1  | RCC_APB2Periph_AFIO
  58.                            |RCC_APB2Periph_SPI1, ENABLE );
  59.   //RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
  60.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
  61.                            |RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2                                  
  62.                            , ENABLE );
  63.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  64.         /* CAN Periph clock enable */
  65.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  66. }

  67. void InitDis(void)
  68. {
  69.    /* LCD Module init */
  70.    GLCD_init();
  71.    GLCD_clear(White);
  72.    GLCD_setTextColor(Blue);
  73.    GLCD_displayStringLn(Line1, "     FireBull");
  74.    GLCD_displayStringLn(Line2, "   CAN example");
  75.    GLCD_setTextColor(Red);
  76. }

  77. //配置所有外设
  78. void Init_All_Periph(void)
  79. {
  80.         RCC_Configuration();       
  81.         InitDis();
  82. //        GLCD_Test();
  83.         GPIO_Configuration();
  84.         NVIC_Configuration();
  85. }

  86. int main(void)
  87. {  
  88.         Init_All_Periph();
  89.         UART1Init();
  90.         GPIO_SetBits(GPIOB, GPIO_Pin_14);
  91.          GPIO_SetBits(GPIOB, GPIO_Pin_12);
  92.          GPIO_SetBits(GPIOB, GPIO_Pin_13);

  93.         /* CAN transmit at 100Kb/s and receive by polling in loopback mode*/
  94. //          TestRx = CAN_Polling();

  95. //          if (TestRx == FAILED)
  96. //          {
  97.             /* Turn on led connected to PD.04 pin (LD3) */
  98. //            GPIO_SetBits(GPIOB, GPIO_Pin_14);
  99. //          }
  100. //          else
  101. //          {
  102.             /* Turn on led connected to PD.02 pin (LD1) */
  103. //            GPIO_SetBits(GPIOB, GPIO_Pin_12);
  104. //          }

  105.           /* CAN transmit at 500Kb/s and receive by interrupt in loopback mode*/
  106.           TestRx = CAN_Interrupt();

  107. //          if (TestRx == FAILED)
  108. //          {
  109.                     /* Turn on led connected to PD.07 pin (LD4) */
  110. //            GPIO_SetBits(GPIOB, GPIO_Pin_13);
  111. //          }
  112. //          else
  113. //          {
  114.             /* Turn on led connected to PD.03 pin (LD2) */
  115. //            GPIO_SetBits(GPIOB, GPIO_Pin_12);
  116. //         }
  117.         while(1)
  118.           {
  119.           }
  120. }

  121. /*******************************************************************************
  122. * Function Name  : CAN_Polling
  123. * Description    : Configures the CAN and transmit and receive by polling
  124. * Input          : None
  125. * Output         : None
  126. * Return         : PASSED if the reception is well done, FAILED in other case
  127. *******************************************************************************/
  128. TestStatus CAN_Polling(void)
  129. {
  130.   CAN_InitTypeDef        CAN_InitStructure;
  131.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  132.   CanTxMsg TxMessage;
  133.   CanRxMsg RxMessage;
  134.   u32 i = 0;
  135.   u8 TransmitMailbox;

  136.   /* CAN register init */
  137.   CAN_DeInit(CAN1);
  138.   CAN_StructInit(&CAN_InitStructure);

  139.   /* CAN cell init */
  140.   CAN_InitStructure.CAN_TTCM=DISABLE;
  141.   CAN_InitStructure.CAN_ABOM=DISABLE;
  142.   CAN_InitStructure.CAN_AWUM=DISABLE;
  143.   CAN_InitStructure.CAN_NART=DISABLE;
  144.   CAN_InitStructure.CAN_RFLM=DISABLE;
  145.   CAN_InitStructure.CAN_TXFP=DISABLE;
  146.   CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_LoopBack;
  147.   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  148.   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  149.   CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  150.   CAN_InitStructure.CAN_Prescaler=5;
  151.   CAN_Init(CAN1,&CAN_InitStructure);

  152.   /* CAN filter init */
  153.   CAN_FilterInitStructure.CAN_FilterNumber=0;
  154.   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  155.   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  156.   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  157.   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  158.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  159.   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  160.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
  161.   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  162.   CAN_FilterInit(&CAN_FilterInitStructure);

  163.   /* transmit */
  164.   TxMessage.StdId=0x11;
  165.   TxMessage.RTR=CAN_RTR_DATA;
  166.   TxMessage.IDE=CAN_ID_STD;
  167.   TxMessage.DLC=2;
  168.   TxMessage.Data[0]=0xCA;
  169.   TxMessage.Data[1]=0xFE;

  170.   TransmitMailbox=CAN_Transmit(CAN1,&TxMessage);
  171.   i = 0;
  172.   while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK) && (i != 0xFF))
  173.   {
  174.     i++;
  175.   }

  176.   i = 0;
  177.   while((CAN_MessagePending(CAN1,CAN_FIFO0) < 1) && (i != 0xFF))
  178.   {
  179.     i++;
  180.   }

  181.   /* receive */
  182.   RxMessage.StdId=0x00;
  183.   RxMessage.IDE=CAN_ID_STD;
  184.   RxMessage.DLC=0;
  185.   RxMessage.Data[0]=0x00;
  186.   RxMessage.Data[1]=0x00;
  187.   CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);

  188.   if (RxMessage.StdId!=0x11) return FAILED;

  189.   if (RxMessage.IDE!=CAN_ID_STD) return FAILED;

  190.   if (RxMessage.DLC!=2) return FAILED;

  191.   if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) return FAILED;
  192.   
  193.   return PASSED; /* Test Passed */
  194. }

  195. /*******************************************************************************
  196. * Function Name  : CAN_Interrupt
  197. * Description    : Configures the CAN and transmit and receive by interruption
  198. * Input          : None
  199. * Output         : None
  200. * Return         : PASSED if the reception is well done, FAILED in other case
  201. *******************************************************************************/
  202. TestStatus CAN_Interrupt(void)
  203. {
  204.   CAN_InitTypeDef        CAN_InitStructure;
  205.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  206.   CanTxMsg TxMessage;
  207.   u32 i = 0;

  208.   /* CAN register init */
  209.   CAN_DeInit(CAN1);
  210.   CAN_StructInit(&CAN_InitStructure);

  211.   /* CAN cell init */
  212.   CAN_InitStructure.CAN_TTCM=DISABLE;
  213.   CAN_InitStructure.CAN_ABOM=DISABLE;
  214.   CAN_InitStructure.CAN_AWUM=DISABLE;
  215.   CAN_InitStructure.CAN_NART=DISABLE;
  216.   CAN_InitStructure.CAN_RFLM=DISABLE;
  217.   CAN_InitStructure.CAN_TXFP=DISABLE;
  218.   CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_LoopBack;
  219.   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  220.   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  221.   CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  222.   CAN_InitStructure.CAN_Prescaler=1;
  223.   CAN_Init(CAN1,&CAN_InitStructure);

  224.   /* CAN filter init */
  225.   CAN_FilterInitStructure.CAN_FilterNumber=1;
  226.   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  227.   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  228.   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  229.   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  230.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  231.   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  232.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  233.   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  234.   CAN_FilterInit(&CAN_FilterInitStructure);

  235.   /* CAN FIFO0 message pending interrupt enable */
  236. CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);

  237.   /* transmit 1 message */
  238. /* TxMessage.StdId=0x00;
  239.   TxMessage.ExtId=0x1234;
  240.   TxMessage.IDE=CAN_ID_EXT;
  241.   TxMessage.RTR=CAN_RTR_DATA;
  242.   TxMessage.DLC=2;
  243.   TxMessage.Data[0]=0xDE;
  244.   TxMessage.Data[1]=0xCA;
  245.   CAN_Transmit(CAN1,&TxMessage);

  246.   /* initialize the value that will be returned */
  247. /*  ret = 0xFF;
  248.       
  249.   /* receive message with interrupt handling */
  250. /*  i=0;
  251.   while((ret == 0xFF) && (i < 0xFFF))
  252.   {
  253.     i++;
  254.   }
  255.   
  256.   if (i == 0xFFF)
  257.   {
  258.     ret=0;  
  259.   }

  260.   /* disable interrupt handling */
  261. // CAN_ITConfig(CAN1,CAN_IT_FMP0, DISABLE);

  262.   return (TestStatus)ret;
  263. }

  264. /*******************************************************************************
  265. * Function Name  : USB_LP_CAN_RX0_IRQHandler
  266. * Description    : This function handles USB Low Priority or CAN RX0 interrupts
  267. *                  requests.
  268. * Input          : None
  269. * Output         : None
  270. * Return         : None
  271. *******************************************************************************/
  272. void USB_LP_CAN1_RX0_IRQHandler(void)
  273. {
  274.   CanRxMsg RxMessage;

  275.   RxMessage.StdId=0x00;
  276.   RxMessage.ExtId=0x00;
  277.   RxMessage.IDE=0;
  278.   RxMessage.DLC=0;
  279.   RxMessage.FMI=0;
  280.   RxMessage.Data[0]=0x00;
  281.   RxMessage.Data[1]=0x00;

  282.   CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
  283.   UART1SendByte(RxMessage.Data[0]);
  284.   UART1SendByte(RxMessage.Data[1]);
  285.   //GPIO_ResetBits(GPIOB, GPIO_Pin_13);
  286.   if((RxMessage.Data[0]==0x99)&&(RxMessage.Data[1]==0xbb))   
  287.   { GPIO_ResetBits(GPIOB, GPIO_Pin_14);}
  288.    if((RxMessage.Data[0]==0x55)&&(RxMessage.Data[1]==0x77))   
  289.   { GPIO_ResetBits(GPIOB, GPIO_Pin_12);}
  290.    if((RxMessage.Data[0]==0x11)&&(RxMessage.Data[1]==0x33))   
  291.   { GPIO_ResetBits(GPIOB, GPIO_Pin_13);        }
  292.    

  293. /* if((RxMessage.ExtId==0x1234) && (RxMessage.IDE==CAN_ID_EXT)
  294.      && (RxMessage.DLC==2) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xDECA))
  295.   {
  296.     ret = 1;
  297.         GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  298.        
  299.   }*/
  300.   
  301.   }
复制代码

所有资料51hei提供下载:
发送.zip (345.75 KB, 下载次数: 4)
接收.zip (371.52 KB, 下载次数: 5)


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

使用道具 举报

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

使用道具 举报

板凳
ID:282095 发表于 2019-8-30 19:24 | 只看该作者
不完整啊
回复

使用道具 举报

地板
ID:56665 发表于 2019-8-30 20:00 | 只看该作者
请楼主详细说明一下开发这个灯具的过程,这个灯具怎么使用等,程序关键注释要有。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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