[菜农助学交流] 助学板把玩,第三帖.GPIO.LED.TIMER

[复制链接]
3078|3
 楼主| 毅如靳往 发表于 2011-9-30 21:25 | 显示全部楼层 |阅读模式
开学后一直很忙,实习课设接踵而来,而悲催的学校发生网络故障发生一周之久,很多事都没做成。对cortex的学习陷入了一种泥潭,有点找不到方向了。正在努力寻找中~在这里贴上我最近写的程序,无非还是GPIO的应用。
加入了按键对LED的控制,以及结合了网友的一个蜂鸣器演奏八月桂花香的音乐程序。加入了PWM控制PA12灯闪烁的功能,不过因为效果不理想所以我屏蔽了,代码还在程序中
有兴趣的可以研究研究

  1. /***************************************************************************
  2. * 文件名:新唐M0学习程序
  3. * 作  者:毅如靳往
  4. * 邮  箱:oceanking7@163.com
  5. * 功  能:对新唐M0的各个模块进行学习
  6. * 备  注:¥已经利用的功能¥
  7. *                  按键
  8. *         LED灯
  9. *                   蜂鸣器
  10. *                  TIMER
  11. *                  PWM
  12. *                  UART
  13. ****************************************************************************
  14. * 版本信息 *
  15. * 日    期:2011-09-20
  16. * 待改进: 按键松手检测
  17. *                   增加音乐程序的开关
  18. *                   PWM程序不理想,加入音乐代码则去不成调,尝试融合
  19. ****************************************************************************/
  20. #include <stdio.h>
  21. #include "NUC1xx.h"
  22. #include "DrvGPIO.h"
  23. #include "DrvSYS.h"
  24. #include "Drvtimer.h"
  25. #include "DrvUART.h"
  26. #include "DrvPWM.h"

  27. //=====================================函数声明=============================================
  28. void init(void);
  29. void key_scan(void);
  30. void delay_loop(void);
  31. void display(void);
  32. void init_port(void);
  33. void didi(unsigned char);
  34. void music(void);
  35. void Timer0_Callback(void);
  36. void PWM_Config(void);
  37. void DRVPWM_PwmIRQHandler(void);

  38. //=====================================全局变量=============================================               
  39. uint8_t KEY1_ST,KEY2_ST;                                     //定义按键1,2的状态储存变量
  40. uint8_t LED1_ST=0,LED2_ST=0;                                //定义LED灯1,2的状态储存变量
  41. uint32_t tmp;
  42. uint32_t i;

  43. uint8_t n;
  44. //=================================八月桂花香音乐代码=============================================               
  45. uint8_t music_tab1[] ={   
  46.                                 //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
  47.                                                         0x18, 0x30, 0x1C , 0x10,   0x20, 0x40, 0x1C , 0x10,   0x18, 0x10, 0x20 , 0x10,   0x1C, 0x10, 0x18 , 0x40,   0x1C, 0x20, 0x20 , 0x20,   
  48.                                                         0x1C, 0x20, 0x18 , 0x20,   0x20, 0x80, 0xFF , 0x20,   0x30, 0x1C, 0x10 , 0x18,   0x20, 0x15, 0x20 , 0x1C,   0x20, 0x20, 0x20 , 0x26,   
  49.                                                         0x40, 0x20, 0x20 , 0x2B,   0x20, 0x26, 0x20 , 0x20,   0x20, 0x30, 0x80 , 0xFF,   0x20, 0x20, 0x1C , 0x10,   0x18, 0x10, 0x20 , 0x20,   
  50.                                                         0x26, 0x20, 0x2B , 0x20,   0x30, 0x20, 0x2B , 0x40,   0x20, 0x20, 0x1C , 0x10,   0x18, 0x10, 0x20 , 0x20,   0x26, 0x20, 0x2B , 0x20,   
  51.                                                         0x30, 0x20, 0x2B , 0x40,   0x20, 0x30, 0x1C , 0x10,   0x18, 0x20, 0x15 , 0x20,   0x1C, 0x20, 0x20 , 0x20,   0x26, 0x40, 0x20 , 0x20,   
  52.                                                         0x2B, 0x20, 0x26 , 0x20,   0x20, 0x20, 0x30 , 0x80,   0x20, 0x30, 0x1C , 0x10,   0x20, 0x10, 0x1C , 0x10,  0x20, 0x20, 0x26 , 0x20,   
  53.                                                         0x2B, 0x20, 0x30 , 0x20,   0x2B, 0x40, 0x20 , 0x15,   0x1F, 0x05, 0x20 , 0x10,   0x1C, 0x10, 0x20 , 0x20,   0x26, 0x20, 0x2B , 0x20,   
  54.                                                         0x30, 0x20, 0x2B , 0x40,   0x20, 0x30, 0x1C , 0x10,   0x18, 0x20, 0x15 , 0x20,   0x1C, 0x20, 0x20 , 0x20,   0x26, 0x40, 0x20 , 0x20,   
  55.                                                         0x2B, 0x20, 0x26 , 0x20,   0x20, 0x20, 0x30 , 0x30,   0x20, 0x30, 0x1C , 0x10,   0x18, 0x40, 0x1C , 0x20,   0x20, 0x20, 0x26 , 0x40,   
  56.                                                         0x13, 0x60, 0x18 , 0x20,   0x15, 0x40, 0x13 , 0x40,   0x18, 0x80, 0x00
  57.                                             };



  58. /****************************************************************************
  59. * 名    称:main()
  60. * 功    能:主函数
  61. * 说    明:
  62. ****************************************************************************/
  63. int main (void)
  64. {       
  65.         UNLOCKREG();
  66.     SYSCLK->PWRCON.XTL12M_EN = 1;                        // SYSCLK =>12Mhz       
  67.         DrvSYS_Delay(5000);                                                 //  等待时钟就绪                                                                                           
  68.         LOCKREG();                       
  69. //---------------------------临时变量---------------------------------\\   


  70. //---------------------------初始化---------------------------------\\   
  71.         init();                                                                        //功能初始化
  72.         init_port();                                                        //IO初始化
  73.           
  74.         PWM_Config();                                                          /*PWM01配置函数*/
  75.       
  76.         DrvPWM_Enable(DRVPWM_TIMER0, 1);                           /* Enable the PWM Timer 0 */

  77. //---------------------------大循环----------------------------------\\   
  78.         while(1)
  79.         {
  80.                 key_scan();                                                        //键盘扫描
  81.                 display();                                                        //显示
  82.                 music();                                               
  83. /*                for( i=0;i<50;i++)
  84.                 {
  85.                     tmp = ((PWMA->CNR0)+1)*(i*2)/100-1;
  86.                     PWMA->CMR0 = tmp;
  87.                         DrvSYS_Delay(10000);
  88.                 }
  89.                  i=0;          */
  90.         }
  91. }

  92. /****************************************************************************
  93. * 名    称:init()
  94. * 功    能:功能初始化函数
  95. * 入口参数:main()
  96. * 出口参数:
  97. * 说    明:
  98. ****************************************************************************/
  99. void init(void)
  100. {
  101.         DrvGPIO_InitFunction(E_FUNC_UART0);
  102. //=====================================定时器初始化=============================================               
  103.         {
  104.                 DrvTIMER_Init();        
  105.                 /*定时器初始化函数*/
  106.        
  107.                 DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0);        
  108.                 /*TIMER0 时钟源选择:000 =外部12MHz 晶振 、001 =外部 32KHz 晶振 、010 = HCLK 、011 = 外部触发时钟 、1xx =内部 22MHz 振荡器 */
  109.                
  110.                 DrvTIMER_Open(E_TMR0,100,E_PERIODIC_MODE);       
  111.                 /*设定定时器 tick 周期并且启动定时器:定时器通道 TMR0 每秒1次 周期模式*/
  112.                
  113.                 DrvTIMER_SetTimerEvent(E_TMR0,1,(TIMER_CALLBACK) Timer0_Callback,0);       
  114.                 /* 隔1个tick执行事件,parameter3-事件处理函数指针,4-传递参数*/
  115.                
  116.                 DrvTIMER_EnableInt(E_TMR0);                 //使能定时器中断
  117.                
  118.                 DrvTIMER_Start(E_TMR0);                         //启动定时器
  119.         }


  120. //=====================================串口初始化=============================================               
  121.         {
  122.                 STR_UART_T param;
  123.                        
  124.                 DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);                         //         使能UART时钟
  125.                 DrvGPIO_InitFunction(E_FUNC_UART0);                                                         //         复用功能引脚设置
  126.                
  127.             param.u32BaudRate        = 115200;                                                         //         波特率
  128.             param.u8cDataBits        = DRVUART_DATABITS_8;                                 //         数据位
  129.             param.u8cStopBits        = DRVUART_STOPBITS_1;                                 //         停止位
  130.             param.u8cParity          = DRVUART_PARITY_NONE;                                 //         校验位
  131.             param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;                                 //         FIFO存储深度 1 字节
  132.             param.u8TimeOut                 = 0;                                                                 //         FIFO超时设定
  133.             DrvUART_Open(UART_PORT0, ¶m);                                                         //         串口开启、结构体整体赋值          
  134.         }                                                         

  135. }
  136. /****************************************************************************
  137. * 名    称:init_port()
  138. * 功    能:端口初始化函数
  139. * 入口参数:main()
  140. * 出口参数:
  141. * 说    明:
  142. ****************************************************************************/
  143. void init_port(void)
  144. {
  145.         DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);                                                  //////////////////
  146.         DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);                                                  //     LED      //  
  147.         DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);                                            //     配置     //
  148.         DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);                                                  //////////////////

  149.         DrvGPIO_SetBit(E_GPA,2);
  150.         DrvGPIO_SetBit(E_GPA,3);
  151.         DrvGPIO_SetBit(E_GPA,4);
  152.         DrvGPIO_SetBit(E_GPA,5);


  153.            /*设置PA12为输出,PA12为PWM01功能*/
  154.     DrvGPIO_InitFunction(E_FUNC_PWM01);


  155.         DrvGPIO_Open(E_GPB, 15, E_IO_INPUT);                                   //按键IO类型配置
  156.         DrvGPIO_Open(E_GPB, 14, E_IO_INPUT);

  157.         DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);                                        //蜂鸣器IO类型配置
  158.         DrvGPIO_ClrBit(E_GPB,10);
  159. }


  160. /****************************************************************************
  161. * 名    称:key_scan()
  162. * 功    能:键盘扫描函数
  163. * 入口参数:main()
  164. * 出口参数:
  165. * 说    明:GPB15-----KEY1                                GPB14-------KEY2
  166. ****************************************************************************/
  167. void key_scan(void)
  168. {
  169.         KEY1_ST = DrvGPIO_GetBit (E_GPB, 15);                                   //获取KEY1的值
  170.         KEY2_ST = DrvGPIO_GetBit (E_GPB, 14);                                   //获取KEY2的值
  171. //按键KEY1的响应动作
  172.         if (KEY1_ST == 0)
  173.         {
  174.                 delay_loop();                                                                         //消抖
  175.                 delay_loop();                                                                         //消抖(写两个是为了足够的消抖时间)
  176.                  if (KEY1_ST == 0)
  177.                 {
  178.                         if(++LED1_ST>5)        LED1_ST=0;
  179.                         didi(1);                        //形参传递为几  则蜂鸣器响几声
  180.                 }
  181.         }
  182. //按键KEY2的响应动作
  183.         if (KEY2_ST == 0)
  184.         {
  185.                 delay_loop();
  186.                 delay_loop();
  187.                  if (KEY2_ST == 0)
  188.                 {
  189.                         LED2_ST=~LED2_ST;
  190. /*                        if(LED2_ST==0)
  191.                                 music();
  192.                         else
  193.                                 didi(1);                        */
  194. //                        while(!KEY1_ST)                          //按键松手检测
  195. //                        {
  196. //                                 display();
  197. //                        }
  198.                 }
  199.         }

  200. }
  201. /****************************************************************************
  202. * 名    称:display()
  203. * 功    能:显示函数
  204. * 入口参数:main()
  205. * 出口参数:
  206. * 说    明:
  207. ****************************************************************************/
  208. void display(void)
  209. {
  210.         switch(LED1_ST)
  211.         {
  212.                  case 0:        DrvGPIO_SetBit(E_GPA,2);
  213.                                 DrvGPIO_SetBit(E_GPA,3);
  214.                                 DrvGPIO_SetBit(E_GPA,4);
  215.                                 DrvGPIO_SetBit(E_GPA,5);
  216.                                 break;
  217.                  case 1:        DrvGPIO_ClrBit(E_GPA,2);
  218.                                 DrvGPIO_SetBit(E_GPA,3);
  219.                                 DrvGPIO_SetBit(E_GPA,4);
  220.                                 DrvGPIO_SetBit(E_GPA,5);
  221.                                 break;
  222.                 case 2:        DrvGPIO_ClrBit(E_GPA,3);
  223.                                 DrvGPIO_SetBit(E_GPA,2);
  224.                                 DrvGPIO_SetBit(E_GPA,4);
  225.                                 DrvGPIO_SetBit(E_GPA,5);
  226.                                 break;
  227.                 case 3:        DrvGPIO_ClrBit(E_GPA,4);
  228.                                 DrvGPIO_SetBit(E_GPA,2);
  229.                                 DrvGPIO_SetBit(E_GPA,3);
  230.                                 DrvGPIO_SetBit(E_GPA,5);
  231.                                 break;
  232.                 case 4:        DrvGPIO_ClrBit(E_GPA,5);
  233.                                 DrvGPIO_SetBit(E_GPA,2);
  234.                                 DrvGPIO_SetBit(E_GPA,3);
  235.                                 DrvGPIO_SetBit(E_GPA,4);
  236.                                 break;
  237.                 case 5:       
  238.                                  DrvGPIO_ClrBit(E_GPA,2);
  239.                                 DrvGPIO_SetBit(E_GPA,3);
  240.                                 DrvGPIO_SetBit(E_GPA,4);
  241.                                 DrvGPIO_SetBit(E_GPA,5);
  242.                                 delay_loop();
  243.                                 DrvGPIO_ClrBit(E_GPA,3);
  244.                                 DrvGPIO_SetBit(E_GPA,2);
  245.                                 DrvGPIO_SetBit(E_GPA,4);
  246.                                 DrvGPIO_SetBit(E_GPA,5);
  247.                                 delay_loop();
  248.                                 DrvGPIO_ClrBit(E_GPA,4);
  249.                                 DrvGPIO_SetBit(E_GPA,2);
  250.                                 DrvGPIO_SetBit(E_GPA,3);
  251.                                 DrvGPIO_SetBit(E_GPA,5);
  252.                                 delay_loop();
  253.                                 DrvGPIO_ClrBit(E_GPA,5);
  254.                                 DrvGPIO_SetBit(E_GPA,2);
  255.                                 DrvGPIO_SetBit(E_GPA,3);
  256.                                 DrvGPIO_SetBit(E_GPA,4);
  257.                                 delay_loop();
  258.                                  DrvGPIO_SetBit(E_GPA,2);
  259.                                 DrvGPIO_SetBit(E_GPA,3);
  260.                                 DrvGPIO_SetBit(E_GPA,4);
  261.                                 DrvGPIO_SetBit(E_GPA,5);
  262.                                 delay_loop();
  263.                                 break;
  264.         }
  265. }



  266. /****************************************************************************
  267. * 名    称:delay_loop()
  268. * 功    能:延时函数
  269. * 入口参数:
  270. * 出口参数:
  271. * 说    明:
  272. ****************************************************************************/
  273. void delay_loop(void)                         
  274. {
  275.         uint32_t j;
  276.         for(j=0;j<60000;j++);               
  277.         for(j=0;j<60000;j++);
  278.         for(j=0;j<60000;j++);               
  279.         for(j=0;j<60000;j++);
  280. }


  281. /****************************************************************************
  282. * 名    称:didi(unsigned char n)
  283. * 功    能:发声函数
  284. * 入口参数:key_scan()
  285. * 出口参数:
  286. * 说    明:形参传递为几  则蜂鸣器响几声
  287. ****************************************************************************/
  288. void didi(unsigned char n)
  289. {
  290.         for(;n>0;n--)
  291.         {
  292.                 DrvGPIO_SetBit(E_GPB,10);                 //鸣叫
  293.                 delay_loop();
  294.                 DrvGPIO_ClrBit(E_GPB,10);
  295.                 delay_loop();                                         //静音
  296.         }
  297. }

  298. /****************************************************************************
  299. * 名    称:Timer0_Callback(void)
  300. * 功    能:Timer0回调函数
  301. * 入口参数:
  302. * 出口参数:
  303. * 说    明:
  304. ****************************************************************************/
  305. void Timer0_Callback(void)
  306. {

  307.         n--;

  308. }


  309. /****************************************************************************
  310. * 名    称:music(void)
  311. * 功    能:音乐函数
  312. * 入口参数:
  313. * 出口参数:
  314. * 说    明:
  315. ****************************************************************************/
  316. void music(void)
  317. {
  318.         uint8_t p,m,flag;   //m为频率常数变量   
  319.           uint8_t i=0;
  320.         uint8_t music_on=0;
  321.        
  322.         music_on=LED2_ST;

  323.         play:   
  324.            while(music_on)   
  325.             {   
  326.             a: p=music_tab1[i];   
  327.                if(p==0x00)  
  328.                    {
  329.                                    i=0;
  330.                                 DrvSYS_Delay(1000000);
  331.                                 goto play;
  332.                    }     
  333.                else if(p==0xff)
  334.                            {
  335.                                 i=i+1;
  336.                                 DrvSYS_Delay(100000);
  337.                                 DrvTIMER_DisableInt(E_TMR0);
  338.                                 goto a;
  339.                         }      
  340.                else  
  341.                    {
  342.                                    m=music_tab1[i++];
  343.                                 n=music_tab1[i++];
  344.                         }      
  345.                         DrvTIMER_EnableInt(E_TMR0);                 //使能定时器中断
  346.                         DrvTIMER_Start(E_TMR0);                                 //启动定时器
  347.                    while(n!=0)
  348.                    {
  349.                            if (flag) DrvGPIO_ClrBit(E_GPB, 10);                           //蜂鸣器
  350.                            else
  351.                            DrvGPIO_SetBit(E_GPB, 10);
  352.                            DrvSYS_Delay(3*m);
  353.                            flag=~flag;
  354.                    }
  355.                        

  356.                         DrvTIMER_DisableInt(E_TMR0);  
  357.                         
  358.             }                                  
  359. }


  360. /****************************************************************************
  361. * 名    称:DRVPWM_PwmIRQHandler()
  362. * 功    能:PWM Timer Callback function
  363. * 入口参数:
  364. * 出口参数:
  365. * 说    明:
  366. ****************************************************************************/
  367. void DRVPWM_PwmIRQHandler()
  368. {       
  369. /*  uint8_t E_GPA_STA=DrvGPIO_GetBit(E_GPA , 2);
  370.    if(E_GPA_STA==1);
  371.    {
  372.               DrvGPIO_ClrBit(E_GPA,2);
  373.    }
  374.    if(E_GPA_STA==0)
  375.    {
  376.            DrvGPIO_SetBit(E_GPA,2);
  377.    }
  378.          */
  379.         ;
  380. }
  381. /****************************************************************************
  382. * 名    称:PWM_Config()
  383. * 功    能:PWM配置函数
  384. * 入口参数:
  385. * 出口参数:
  386. * 说    明:
  387. ****************************************************************************/
  388. void PWM_Config()
  389. {
  390.                 S_DRVPWM_TIME_DATA_T sPt;//定义一个PWM配置的结构体
  391.         /*
  392.             结构体如下:
  393.             typedef struct
  394.             {
  395.                 uint8_t          u8Mode;
  396.                 uint8_t          u8HighPulseRatio;
  397.                 uint8_t          u8ClockSelector;
  398.                 uint8_t          u8PreScale;
  399.                 uint32_t            u32Frequency;       
  400.                 uint32_t            u32Duty;
  401.                 int32_t          i32Inverter;
  402.             }S_DRVPWM_TIME_DATA_T;
  403.             */
  404.                 sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;//自动重载模式
  405.                 sPt.u8HighPulseRatio=50;

  406.         //        spt.u8ClockSelector=   
  407.         //        spt.u8PreScale=   
  408.                 sPt.u32Frequency=400;
  409.         //        spt.u32Duty=
  410.                 sPt.i32Inverter=0;

  411.                 /* Enable PWM clock */
  412.         DrvPWM_Open();       

  413.                 /* Select PWM engine clock */
  414.                 DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);  //设置外部12M时钟为时钟源

  415.                 /* Set PWM Timer0 Configuration */
  416.                 DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);


  417.                 /* Enable Output for PWM Timer0 */
  418.             DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);


  419.                 /* Enable Interrupt Sources of PWM Timer0 and install call back function */
  420.                 DrvPWM_EnableInt(DRVPWM_TIMER0, 0, DRVPWM_PwmIRQHandler);


  421.        
  422. }

 楼主| 毅如靳往 发表于 2011-9-30 21:46 | 显示全部楼层

工程文件
忘记添加了~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-10-1 14:40 | 显示全部楼层
不错!
 楼主| 毅如靳往 发表于 2011-10-1 23:05 | 显示全部楼层
其实我个人觉得程序本体倒是没什么创新,希望能给各位以我编程格式的一个启发,因为我看很多人的代码都只是代码,多加注释,对自己以后的审阅也有帮助的,当然,只是建议
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

176

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部