打印
[DemoCode下载]

使用GPIO及TIMER模擬串口

[复制链接]
953|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a_ziliu|  楼主 | 2016-12-26 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用GPIO及TIMER模擬串口
EC_NUC230_240_GPIO_UART.zip (1011.57 KB)
沙发
643757107| | 2016-12-26 14:45 | 只看该作者
ARM都可以用IO模拟串口,楼主水平不简单

使用特权

评论回复
板凳
598330983| | 2016-12-26 16:29 | 只看该作者
用定时器配合IO模拟的串口还是很靠谱的。

使用特权

评论回复
地板
稳稳の幸福| | 2016-12-26 22:34 | 只看该作者
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 2 $
* $Date: 15/08/18 11:54a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    NUC200 Series I2S Controller Sample Code
*
* @note
* Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "NUC230_240.h"
#include "NuEdu-Basic01.h"

volatile unsigned int data;
volatile unsigned int count;
volatile unsigned int p_flag;
/**
* @brief       Timer0 IRQ
*
* @param       None
*
* [url=home.php?mod=space&uid=266161]@return[/url]      None
*
* [url=home.php?mod=space&uid=1543424]@Details[/url]     The Timer0 default IRQ, declared in startup_M051Series.s.
*/
void TMR0_IRQHandler(void)
{
    /* Clear Timer0 time-out interrupt flag */
     TIMER_ClearIntFlag(TIMER0);     
           if(count!=0)
                 {
                        if((data&0x01)==0x01)
             PA0=1;
                         else
                         PA0=0;
                  data=data>>1;
                        count--;
                 }
       
}

void UART_GPIO(unsigned char uart_data)
{
        data=0;
        data=(uart_data<<1)|(1<<9);  //STOP BIT + 8 DATA BIT + START BIT
        count=10;
       
  /* Start Timer0 counting */
        TIMER_Start(TIMER0);
        while(count!=0);
        /* Stop timer0 counting */
        TIMER_Stop(TIMER0);
}
void SW_UART_INIT(void)
{
    GPIO_SetMode(PA, BIT0, GPIO_PMD_OUTPUT);
            /* Enable peripheral clock */
          CLK->APBCLK |= CLK_APBCLK_TMR0_EN_Msk ;
            /* Peripheral clock source */
          CLK->CLKSEL1 |= CLK_CLKSEL1_TMR0_S_HIRC;
       
            /* Open Timer0 frequency 115200 in periodic mode, and enable interrupt */
    TIMER0->TCMPR = (22118400/115200);
    TIMER0->TCSR = TIMER_TCSR_IE_Msk | TIMER_PERIODIC_MODE;
    TIMER_SET_PRESCALE_VALUE(TIMER0, 0);       
       
    /* Enable Timer0 NVIC */
    NVIC_EnableIRQ(TMR0_IRQn);
}

/*---------------------------------------------------------------------------------------------------------*/
/*  MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{       
        unsigned int temp_count;
  SYS_Init();
        SW_UART_INIT();
        for(temp_count=0;temp_count<256;temp_count++)
        {
        UART_GPIO(temp_count&0xff);
        }       
        while(1);   
}


使用特权

评论回复
5
zhuomuniao110| | 2016-12-26 23:29 | 只看该作者
现在越来越多的参数配置使用结构体变量了,这样可以通过一个总变量地址传递进去全部的参数。

使用特权

评论回复
6
huangcunxiake| | 2016-12-27 17:09 | 只看该作者
用51的时候串口是经常这么弄的,后来串口比较多了,就不用模拟了。

使用特权

评论回复
7
nobleliom| | 2016-12-30 20:10 | 只看该作者
一般mcu上面都双串口,三串口了。IO模拟串口,一般都不会用得着的。

使用特权

评论回复
8
yiyigirl2014| | 2016-12-31 10:03 | 只看该作者
学习一下,我还不会玩这种呢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

295

帖子

6

粉丝