[STM8] STM8s005 模拟uart串口

[复制链接]
3868|16
 楼主| 笨笨笨笨小孩 发表于 2015-12-17 15:49 | 显示全部楼层 |阅读模式
STM8s005 用IO口模拟uart串口
 楼主| 笨笨笨笨小孩 发表于 2015-12-17 15:50 | 显示全部楼层
如何使用定时器、中断来实现,新手,求大神们指教
 楼主| 笨笨笨笨小孩 发表于 2015-12-17 16:07 | 显示全部楼层
本帖最后由 笨笨笨笨小孩 于 2015-12-23 15:02 编辑
  1. #include "io2uart.h"
  2. #include "stdio.h"
  3. #include "string.h"

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

  7. void IOInit(void)  
  8. {   
  9.     GPIO_Init(GPIOD, RXD_IN, GPIO_MODE_IN_PU_NO_IT);

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

  14. void Delay_us(unsigned int nCount)  
  15. {  
  16.     for (; nCount != 0; nCount--);  
  17. }  

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

  22. void SEND_0(void)  
  23. {  
  24.     GPIOD->ODR &=0xFE;  //PD3=0,TXD  
  25. }

  26. void WriteByte(unsigned char sdata)   //波特率4800
  27. {  
  28.     unsigned char i;  
  29.     unsigned char value=0;  
  30.     static int xxx = 550;
  31.      
  32.     //发送起始位  
  33.     SEND_0();  
  34.     Delay_us(xxx);//45  
  35.      
  36.     //发送数据位  
  37.     for(i=0;i<8;i++)  
  38.     {  
  39.         value=(sdata&0x01);      //先传低位  
  40.         if(value)  
  41.         {  
  42.             SEND_1();  
  43.         }  
  44.         else
  45.         {  
  46.             SEND_0();  
  47.         }   
  48.         Delay_us(xxx);//40  
  49.         sdata=sdata>>1;
  50.     }  

  51.     //停止位  
  52.     SEND_1();  
  53.     Delay_us(xxx);  //50  
  54. }

  55. unsigned char ReadByte(void)      
  56. {  
  57.     unsigned char i,value=0;  
  58.     while(1)  
  59.     {
  60.         if(!(GPIO_ReadInputData(GPIOD)&0x10))   //RXD_IN  
  61.         {  
  62.             //等过起始位  
  63.             Delay_us(550);  
  64.             
  65.             //接收8位数据位  
  66.             for(i=0;i<8;i++)  
  67.             {  
  68.                 value>>=1;      
  69.                 if((GPIO_ReadInputData(GPIOD)&0x10))      //RXD_IN  
  70.                 {  
  71.                     value|=0x80;  
  72.                 }  
  73.                 Delay_us(550);  
  74.             }  
  75.             
  76.             Delay_us(550);  
  77.             
  78.             return value;  
  79.         }  
  80.     }  
  81. }  

  82. unsigned char ReadAndWrite(unsigned char *RBuf)  
  83. {  
  84.    GPIOD->ODR |= RXD_IN;
  85.     RBuf[0]=ReadByte();
  86.     WriteByte(RBuf[0]);
  87.                
  88.     return 1;  
  89. }


  90. void main( void )
  91. {      
  92.     IOInit();
  93.     __enable_interrupt();
  94.     while(1)
  95.     {   
  96.          ccc=ReadAndWrite(ReadBuf);      
  97.     }   
  98. }

目前实现了使用延时能够接收、发送数据,可是一直调用ReadAndWrite(ReadBuf);   是不行的,求个使用中断、下降沿来触发
布丁奶茶 发表于 2015-12-17 16:16 | 显示全部楼层
你好,我在研究和你同样的问题,不过我的是stm8l的单片机!有兴趣和我交流一下吧。 我的qq531338045
xia00 发表于 2015-12-17 16:22 来自手机 | 显示全部楼层
硬件电路控制也可以实现吧。
毁灭2012 发表于 2015-12-17 16:41 来自手机 | 显示全部楼层
void SEND_1(void)   {       GPIOD->ODR |=0x08;  //PD3=1,TXD   }  ,,这个不是很懂,请教!!!
jar1866 发表于 2015-12-17 17:15 | 显示全部楼层
官方方案:http://www.st.com/web/catalog/to ... 807/SS1754/PF257991,请仔细阅读相关文档说明

评论

全英文,看不懂啊。。。。。。  发表于 2016-5-21 16:48
 楼主| 笨笨笨笨小孩 发表于 2015-12-18 13:13 | 显示全部楼层
毁灭2012 发表于 2015-12-17 16:41
void SEND_1(void)   {       GPIOD->ODR |=0x08;  //PD3=1,TXD   }  ,,这个不是很懂,请教!!! ...

TXD引脚输出高电平
布丁奶茶 发表于 2015-12-18 13:26 | 显示全部楼层
楼主的问题解决了吗
 楼主| 笨笨笨笨小孩 发表于 2015-12-18 14:11 | 显示全部楼层
布丁奶茶 发表于 2015-12-18 13:26
楼主的问题解决了吗

还没有,有方案吗
布丁奶茶 发表于 2015-12-18 15:07 | 显示全部楼层

我用你的程序,用串口助手仿真,完全没反应啊。。。
不过你要用中断的话,在中断处理函数里调用你的ReadAndWrite()函数试试
 楼主| 笨笨笨笨小孩 发表于 2015-12-18 15:51 | 显示全部楼层
布丁奶茶 发表于 2015-12-18 15:07
我用你的程序,用串口助手仿真,完全没反应啊。。。
不过你要用中断的话,在中断处理函数里调用你的ReadA ...

波特率是4800哦,用串口调试时接收发送数据是没有问题的哦,用中断试了下,在中断中挂了
布丁奶茶 发表于 2015-12-18 15:57 | 显示全部楼层
笨笨笨笨小孩 发表于 2015-12-18 15:51
波特率是4800哦,用串口调试时接收发送数据是没有问题的哦,用中断试了下,在中断中挂了 ...

你可以给我个邮箱吗?我想和你交流一下
 楼主| 笨笨笨笨小孩 发表于 2015-12-23 15:01 | 显示全部楼层
  1. stm8s_it.c文件
  2. INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
  3. {
  4.    ReadAndWrite(ReadBuf);
  5. }

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

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

  14.     VM_UART_TXD_PORT_IN;
  15.     VM_UART_RXD_PORT_INT_IN;
  16. }

  17. void main( void )
  18. {
  19.     IOInit();      
  20.     GPIO_init();
  21.      __enable_interrupt();
  22.     while(1)
  23.     {  
  24.     }
  25. }


使用外部中断,下降沿触发中断,接收数据(其他代码不变)
niou_YF 发表于 2016-7-11 21:18 | 显示全部楼层
毁灭2012 发表于 2015-12-17 16:41
void SEND_1(void)   {       GPIOD->ODR |=0x08;  //PD3=1,TXD   }  ,,这个不是很懂,请教!!! ...

发送起始位用的
gyh974 发表于 2017-9-9 16:56 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

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