打印
[STM8]

STM8s005 模拟uart串口

[复制链接]
3356|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
笨笨笨笨小孩|  楼主 | 2015-12-17 15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8s005 用IO口模拟uart串口
沙发
笨笨笨笨小孩|  楼主 | 2015-12-17 15:50 | 只看该作者
如何使用定时器、中断来实现,新手,求大神们指教

使用特权

评论回复
板凳
笨笨笨笨小孩|  楼主 | 2015-12-17 16:07 | 只看该作者
本帖最后由 笨笨笨笨小孩 于 2015-12-23 15:02 编辑
#include "io2uart.h"
#include "stdio.h"
#include "string.h"

unsigned char bbb;
#define RXD_IN  (GPIO_PIN_4)                    //RXD   PD4
#define TXD_OUT (GPIO_PIN_3)                    //TXD        PD3

void IOInit(void)  
{   
    GPIO_Init(GPIOD, RXD_IN, GPIO_MODE_IN_PU_NO_IT);

    GPIOD->DDR |= TXD_OUT;//输出模式
    GPIOD->CR1 |= TXD_OUT;//推挽输出
    GPIO_Init(GPIOD,TXD_OUT,GPIO_MODE_OUT_PP_HIGH_FAST);
}

void Delay_us(unsigned int nCount)  
{  
    for (; nCount != 0; nCount--);  
}  

void SEND_1(void)  
{  
    GPIOD->ODR |=0x08;  //PD3=1,TXD  
}  

void SEND_0(void)  
{  
    GPIOD->ODR &=0xFE;  //PD3=0,TXD  
}

void WriteByte(unsigned char sdata)   //波特率4800
{  
    unsigned char i;  
    unsigned char value=0;  
    static int xxx = 550;
     
    //发送起始位  
    SEND_0();  
    Delay_us(xxx);//45  
     
    //发送数据位  
    for(i=0;i<8;i++)  
    {  
        value=(sdata&0x01);      //先传低位  
        if(value)  
        {  
            SEND_1();  
        }  
        else
        {  
            SEND_0();  
        }   
        Delay_us(xxx);//40  
        sdata=sdata>>1;
    }  

    //停止位  
    SEND_1();  
    Delay_us(xxx);  //50  
}

unsigned char ReadByte(void)      
{  
    unsigned char i,value=0;  
    while(1)  
    {
        if(!(GPIO_ReadInputData(GPIOD)&0x10))   //RXD_IN  
        {  
            //等过起始位  
            Delay_us(550);  
            
            //接收8位数据位  
            for(i=0;i<8;i++)  
            {  
                value>>=1;      
                if((GPIO_ReadInputData(GPIOD)&0x10))      //RXD_IN  
                {  
                    value|=0x80;  
                }  
                Delay_us(550);  
            }  
            
            Delay_us(550);  
            
            return value;  
        }  
    }  
}  

unsigned char ReadAndWrite(unsigned char *RBuf)  
{  
   GPIOD->ODR |= RXD_IN;
    RBuf[0]=ReadByte();
    WriteByte(RBuf[0]);
               
    return 1;  
}


void main( void )
{      
    IOInit();
    __enable_interrupt();
    while(1)
    {   
         ccc=ReadAndWrite(ReadBuf);      
    }   
}

目前实现了使用延时能够接收、发送数据,可是一直调用ReadAndWrite(ReadBuf);   是不行的,求个使用中断、下降沿来触发

使用特权

评论回复
地板
布丁奶茶| | 2015-12-17 16:16 | 只看该作者
你好,我在研究和你同样的问题,不过我的是stm8l的单片机!有兴趣和我交流一下吧。 我的qq531338045

使用特权

评论回复
5
xia00| | 2015-12-17 16:22 | 只看该作者
硬件电路控制也可以实现吧。

使用特权

评论回复
6
毁灭2012| | 2015-12-17 16:41 | 只看该作者
void SEND_1(void)   {       GPIOD->ODR |=0x08;  //PD3=1,TXD   }  ,,这个不是很懂,请教!!!

使用特权

评论回复
7
jar1866| | 2015-12-17 17:15 | 只看该作者
官方方案:http://www.st.com/web/catalog/to ... 807/SS1754/PF257991,请仔细阅读相关文档说明

使用特权

评论回复
评论
28182900 2016-5-21 16:48 回复TA
全英文,看不懂啊。。。。。。 
8
笨笨笨笨小孩|  楼主 | 2015-12-18 13:13 | 只看该作者
毁灭2012 发表于 2015-12-17 16:41
void SEND_1(void)   {       GPIOD->ODR |=0x08;  //PD3=1,TXD   }  ,,这个不是很懂,请教!!! ...

TXD引脚输出高电平

使用特权

评论回复
9
布丁奶茶| | 2015-12-18 13:26 | 只看该作者
楼主的问题解决了吗

使用特权

评论回复
10
笨笨笨笨小孩|  楼主 | 2015-12-18 14:11 | 只看该作者
布丁奶茶 发表于 2015-12-18 13:26
楼主的问题解决了吗

还没有,有方案吗

使用特权

评论回复
11
布丁奶茶| | 2015-12-18 15:07 | 只看该作者

我用你的程序,用串口助手仿真,完全没反应啊。。。
不过你要用中断的话,在中断处理函数里调用你的ReadAndWrite()函数试试

使用特权

评论回复
12
笨笨笨笨小孩|  楼主 | 2015-12-18 15:51 | 只看该作者
布丁奶茶 发表于 2015-12-18 15:07
我用你的程序,用串口助手仿真,完全没反应啊。。。
不过你要用中断的话,在中断处理函数里调用你的ReadA ...

波特率是4800哦,用串口调试时接收发送数据是没有问题的哦,用中断试了下,在中断中挂了

使用特权

评论回复
13
布丁奶茶| | 2015-12-18 15:57 | 只看该作者
笨笨笨笨小孩 发表于 2015-12-18 15:51
波特率是4800哦,用串口调试时接收发送数据是没有问题的哦,用中断试了下,在中断中挂了 ...

你可以给我个邮箱吗?我想和你交流一下

使用特权

评论回复
14
笨笨笨笨小孩|  楼主 | 2015-12-23 15:01 | 只看该作者
stm8s_it.c文件
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
   ReadAndWrite(ReadBuf);
}

main.c文件
#define        VM_UART_TXD_PORT_IN       GPIOD->DDR &= ~(GPIO_PIN_4);GPIOD->CR1 |=  (GPIO_PIN_4);GPIOD->CR2 &=  (~GPIO_PIN_4)  //设定为输出
#define        VM_UART_RXD_PORT_INT_IN    GPIOD->DDR &= ~(GPIO_PIN_3);GPIOD->CR1 |=  (GPIO_PIN_3);GPIOD->CR2 |=  (GPIO_PIN_3) //只上拉输入 不中断
//设置为可中断输入

void GPIO_init(void)
{
    EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PDIS);
    EXTI->CR1 |= (uint8_t)(0x80);//下降沿触发

    VM_UART_TXD_PORT_IN;
    VM_UART_RXD_PORT_INT_IN;
}

void main( void )
{
    IOInit();      
    GPIO_init();
     __enable_interrupt();
    while(1)
    {  
    }
}


使用外部中断,下降沿触发中断,接收数据(其他代码不变)

使用特权

评论回复
15
niou_YF| | 2016-7-11 21:18 | 只看该作者
毁灭2012 发表于 2015-12-17 16:41
void SEND_1(void)   {       GPIOD->ODR |=0x08;  //PD3=1,TXD   }  ,,这个不是很懂,请教!!! ...

发送起始位用的

使用特权

评论回复
16
gyh974| | 2017-9-9 16:56 | 只看该作者

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝