[DemoCode下载] 使用GPIO及TIMER模擬串口

[复制链接]
1163|7
 楼主| a_ziliu 发表于 2016-12-26 10:42 | 显示全部楼层 |阅读模式
使用GPIO及TIMER模擬串口
EC_NUC230_240_GPIO_UART.zip (1011.57 KB, 下载次数: 28)
643757107 发表于 2016-12-26 14:45 | 显示全部楼层
ARM都可以用IO模拟串口,楼主水平不简单
598330983 发表于 2016-12-26 16:29 | 显示全部楼层
用定时器配合IO模拟的串口还是很靠谱的。
稳稳の幸福 发表于 2016-12-26 22:34 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 2 $
  5. * $Date: 15/08/18 11:54a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    NUC200 Series I2S Controller Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "NUC230_240.h"
  14. #include "NuEdu-Basic01.h"

  15. volatile unsigned int data;
  16. volatile unsigned int count;
  17. volatile unsigned int p_flag;
  18. /**
  19. * @brief       Timer0 IRQ
  20. *
  21. * @param       None
  22. *
  23. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  24. *
  25. * [url=home.php?mod=space&uid=1543424]@Details[/url]     The Timer0 default IRQ, declared in startup_M051Series.s.
  26. */
  27. void TMR0_IRQHandler(void)
  28. {
  29.     /* Clear Timer0 time-out interrupt flag */
  30.      TIMER_ClearIntFlag(TIMER0);     
  31.            if(count!=0)
  32.                  {
  33.                         if((data&0x01)==0x01)
  34.              PA0=1;
  35.                          else
  36.                          PA0=0;
  37.                   data=data>>1;
  38.                         count--;
  39.                  }
  40.        
  41. }

  42. void UART_GPIO(unsigned char uart_data)
  43. {
  44.         data=0;
  45.         data=(uart_data<<1)|(1<<9);  //STOP BIT + 8 DATA BIT + START BIT
  46.         count=10;
  47.        
  48.   /* Start Timer0 counting */
  49.         TIMER_Start(TIMER0);
  50.         while(count!=0);
  51.         /* Stop timer0 counting */
  52.         TIMER_Stop(TIMER0);
  53. }
  54. void SW_UART_INIT(void)
  55. {
  56.     GPIO_SetMode(PA, BIT0, GPIO_PMD_OUTPUT);
  57.             /* Enable peripheral clock */
  58.           CLK->APBCLK |= CLK_APBCLK_TMR0_EN_Msk ;
  59.             /* Peripheral clock source */
  60.           CLK->CLKSEL1 |= CLK_CLKSEL1_TMR0_S_HIRC;
  61.        
  62.             /* Open Timer0 frequency 115200 in periodic mode, and enable interrupt */
  63.     TIMER0->TCMPR = (22118400/115200);
  64.     TIMER0->TCSR = TIMER_TCSR_IE_Msk | TIMER_PERIODIC_MODE;
  65.     TIMER_SET_PRESCALE_VALUE(TIMER0, 0);       
  66.        
  67.     /* Enable Timer0 NVIC */
  68.     NVIC_EnableIRQ(TMR0_IRQn);
  69. }

  70. /*---------------------------------------------------------------------------------------------------------*/
  71. /*  MAIN function                                                                                          */
  72. /*---------------------------------------------------------------------------------------------------------*/
  73. int main(void)
  74. {       
  75.         unsigned int temp_count;
  76.   SYS_Init();
  77.         SW_UART_INIT();
  78.         for(temp_count=0;temp_count<256;temp_count++)
  79.         {
  80.         UART_GPIO(temp_count&0xff);
  81.         }       
  82.         while(1);   
  83. }


zhuomuniao110 发表于 2016-12-26 23:29 | 显示全部楼层
现在越来越多的参数配置使用结构体变量了,这样可以通过一个总变量地址传递进去全部的参数。
huangcunxiake 发表于 2016-12-27 17:09 | 显示全部楼层
用51的时候串口是经常这么弄的,后来串口比较多了,就不用模拟了。
nobleliom 发表于 2016-12-30 20:10 | 显示全部楼层
一般mcu上面都双串口,三串口了。IO模拟串口,一般都不会用得着的。
yiyigirl2014 发表于 2016-12-31 10:03 | 显示全部楼层
学习一下,我还不会玩这种呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

310

帖子

6

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