搜索
bottom↓
回复: 39

分享自己移植的STM8 IO口模拟串口 代码

  [复制链接]

出0入0汤圆

发表于 2017-3-18 14:03:12 | 显示全部楼层 |阅读模式
使用普通的IO口,模拟串口协议, 和PC端串口调试软件实现通信。
网上找了很多资料,有很多网友有写程序,但是感觉都不是很完整,无意间看到ST官方居然有实现,直接下载代码开始用。

针对官方的IO口模拟串口软件,简单介绍下用到资源。
由于模拟的串口RX脚,对于电平的输入判断用到定时器的输入捕获功能,所以官方用的是定时器3的通道2。
我自己在STM8S003F3P6最小系统上,移植到了TIM2的CH1即PD4用来做串口的RX脚,和PC端串口调试器的TX脚连接。
模拟串口的TX脚没有特殊要求,我这里用的PD3。。。。
修改了MAIN里面的函数,实现模拟串口直接发送接收到的数据。

PPS,关于串口波特率的配置,
这个软件包你需要配置下使用外部24MHZ还是内部16MHZ的晶振,我这里配置的内部16M,
然后在模拟串口初始化里面,按照需要配置的波特率,配置定时器的时基。
常用的函数注释里面已经有给你计算好,直接copy就好, 我这里用的16M,9600bsp,所以填的是注释里面给的833.

简单配置以后就可以实现IO模拟串口通信了。


主要是为了节约成本,加个硬件的串口,成本又加了。

点我下载源码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-3-18 16:13:13 | 显示全部楼层
能不能用,,下载要积分,

出0入0汤圆

发表于 2017-3-18 16:16:37 | 显示全部楼层
直接传这里不行吗

出0入0汤圆

发表于 2017-3-18 18:03:32 | 显示全部楼层
楼主应该把标题改为“分享自己移植的STM8 IO口模拟串口 代码的CSDN的链接,括弧5积分下一次“
如果真的想分享给坛友就上传到论坛里,别贴外链谢谢!

出0入0汤圆

发表于 2017-3-18 18:06:47 | 显示全部楼层
楼主想赚积分就明说吧

出0入0汤圆

发表于 2017-3-18 18:19:10 来自手机 | 显示全部楼层
哈哈哈。。。。。

出0入8汤圆

发表于 2017-3-18 18:21:46 | 显示全部楼层
无法下载,使用了第三方的连接

出0入0汤圆

发表于 2017-3-18 18:37:23 | 显示全部楼层




本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-3-18 18:39:10 | 显示全部楼层




本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-3-18 18:41:18 | 显示全部楼层

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-3-18 18:53:30 | 显示全部楼层
AN10689
Full-duplex software UART for LPC2000





本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-3-18 19:00:12 | 显示全部楼层
本帖最后由 shangdawei 于 2017-3-18 19:04 编辑









本帖子中包含更多资源

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

x

出10入10汤圆

发表于 2017-3-18 19:06:26 | 显示全部楼层
高波特率时用IO口模拟串口,对CPU的开销比较大,适合系统中其他任务的实时性要求不高场合

出0入0汤圆

发表于 2017-3-18 19:15:13 | 显示全部楼层
szxszx 发表于 2017-3-18 19:06
高波特率时用IO口模拟串口,对CPU的开销比较大,适合系统中其他任务的实时性要求不高场合 ...

如果能使用DMA的话,是不是会好一些?

出0入0汤圆

发表于 2017-3-18 19:16:51 | 显示全部楼层








本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-3-18 19:23:55 | 显示全部楼层

LPC1768的全双工UART的软件模拟实现















本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-3-18 19:31:12 | 显示全部楼层




本帖子中包含更多资源

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

x

出10入10汤圆

发表于 2017-3-18 19:31:19 | 显示全部楼层
IO口中断配合定时器中断高效一些,详见张明峰的《PIC单片机入门与实战》305页有详细介绍

本帖子中包含更多资源

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

x

出0入25汤圆

发表于 2017-3-18 19:34:10 来自手机 | 显示全部楼层
16M,模拟串口跑9600还行,波特率再高,就太耗CPU资源了

出0入0汤圆

 楼主| 发表于 2017-3-19 15:00:54 | 显示全部楼层

用定时器的输入捕获来做电平判断,应该效率不差吧

本帖子中包含更多资源

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

x

出5入10汤圆

发表于 2017-3-19 16:05:07 | 显示全部楼层
楼主的积分太贵了,买不起啊。

出0入0汤圆

发表于 2017-3-19 16:46:55 | 显示全部楼层

感觉你涉及的东西好多.

出0入0汤圆

发表于 2017-3-19 17:25:02 来自手机 | 显示全部楼层
huangrui 发表于 2017-3-18 18:03
楼主应该把标题改为“分享自己移植的STM8 IO口模拟串口 代码的CSDN的链接,括弧5积分下一次“
如果真的想分 ...

好吧我笑了

出0入42汤圆

发表于 2017-3-19 20:22:00 | 显示全部楼层
谢谢楼主分享!试试!

出0入13汤圆

发表于 2017-3-20 07:24:09 来自手机 | 显示全部楼层
谢谢上面分享的模拟串口资料

出0入0汤圆

发表于 2017-3-20 09:29:40 | 显示全部楼层
感觉楼上的出货量好大,每月估计不少于n kk的量,比电子狗值钱多了

出0入0汤圆

发表于 2017-4-18 18:23:44 | 显示全部楼层
经过验证,误码率很高,用于实际项目须谨慎!

出0入53汤圆

发表于 2017-9-25 13:22:32 | 显示全部楼层
lz积分太贵  谁帮忙下载一下

出0入21汤圆

发表于 2017-9-25 16:35:50 | 显示全部楼层
003不是有串口吗

出0入0汤圆

发表于 2017-9-25 17:38:30 | 显示全部楼层

stm8s003f3p6只有一个串口,当初我也写过模拟串口,效果一般。哎~~

出0入53汤圆

发表于 2017-9-26 15:30:22 | 显示全部楼层
nuncle 发表于 2017-3-19 15:00
用定时器的输入捕获来做电平判断,应该效率不差吧

占用系统资源多吗?

出0入53汤圆

发表于 2017-9-26 15:31:19 | 显示全部楼层
lz用过他的硬件spi?

出0入53汤圆

发表于 2017-9-27 13:45:13 | 显示全部楼层
本帖最后由 zhcj66 于 2017-9-27 17:03 编辑
nuncle 发表于 2017-3-19 15:00
用定时器的输入捕获来做电平判断,应该效率不差吧


这个波特率在哪里设置怎么没有看到?

找到了
//定时器设定值=定时器频率/(1/(波特率*2))=定时器频率/波特率/2=16000000/9600/2=833
#define init_UART_timing        {\
        TIM2_TimeBaseInit(TIM2_PRESCALER_1, 833);\
        TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);\
        TIM2_UpdateRequestConfig(TIM2_UPDATESOURCE_REGULAR);\
        TIM2_Cmd(ENABLE);\
}


另外波特率设置成19200和57600都未成功,请问lz是否测试过

出0入53汤圆

发表于 2017-9-27 17:01:58 | 显示全部楼层
本帖最后由 zhcj66 于 2017-9-27 17:04 编辑
nuncle 发表于 2017-3-19 15:00
用定时器的输入捕获来做电平判断,应该效率不差吧


今天调试成功,但是我测试着数据出错概率比较大,以1ms速度发送一个数据上传 随机出错

以10ms速度发送一个数据上传 也会随机出错

不停的发送数据到电脑暂时未发现问题

请问楼主测试的怎么样?

出0入53汤圆

发表于 2017-9-28 10:33:30 | 显示全部楼层
本帖最后由 zhcj66 于 2017-9-28 10:38 编辑

我也来分享我刚刚纯模拟的串口程序吧,已经调试成功,一次只能接收发送1字节数据,全双工


  1. [code]void TIM2_Init(void)
  2. {
  3.     TIM2->ARRH = 0x02; //自动重装载的值 255
  4.     TIM2->ARRL = 0x2c; //自动重装载的值 255
  5.     TIM2->PSCR = 0x00; //不分频
  6.     TIM2->EGR  = 0x01; //手动产生一个更新事件,用于PSC生效       注意,是手动更新
  7.     TIM2->IER = 0x01; //使能溢出中断
  8.     TIM2->CR1 = 0x01; //启动定时器
  9.    
  10.     //中断处理函数在TIM2_UPD_OVF_BRK_IRQHandler
  11. }


  12. INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
  13. {
  14.     UartSoft_Tim();
  15.     TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
  16. }


  17. /**
  18.   ******************************************************************************
  19.   * @File           :UartSoft.c
  20.   * @Author         :BLF
  21.   * @Email          :zhcj66@163.com
  22.   * @Version        :V1.0.0
  23.   * @FileNewDate    :2017-09-27
  24.   * @FileChangeDate :2017-09-27
  25.   * @Brief          :软件模拟3倍波特率全双工串口
  26.                     :定时器中断频率=波特率*3
  27.                     :stm8 定时器设定值=定时器频率/(1/(波特率*3))=定时器频率/波特率/3=16000000/9600/3=555.5=556
  28.                     :测试间隔1ms收发一个数据,同时收发多个数据会出错
  29.   ******************************************************************************
  30.   */
  31. #include "includes.h"
  32. #include "UartSoft.h"


  33. #define RXB_PORT                GPIOD         //工作状态指示LED
  34. #define RXB_PIN                 GPIO_PIN_4
  35. #define TXB_PORT                GPIOD         //工作状态指示LED
  36. #define TXB_PIN                 GPIO_PIN_2


  37. #define RXB                     GPIO_ReadInputPin(RXB_PORT,RXB_PIN)                        //define UART TX/RX port
  38. #define TXB(x)                  x==1?GPIO_WriteHigh(TXB_PORT,TXB_PIN):GPIO_WriteLow(TXB_PORT,TXB_PIN)

  39. typedef unsigned char BOOL;
  40. typedef unsigned char BYTE;

  41. BYTE TBUF,RBUF;
  42. BYTE TDAT,RDAT;
  43. BYTE TCNT,RCNT;
  44. BYTE TBIT,RBIT;
  45. BOOL TING,RING;
  46. BOOL TEND,REND;


  47. BYTE buf[16];

  48. void UartSoft_Init(void)
  49. {
  50.     GPIO_Init(RXB_PORT,RXB_PIN,GPIO_MODE_IN_PU_NO_IT);
  51.     GPIO_Init(TXB_PORT,TXB_PIN,GPIO_MODE_OUT_PP_HIGH_FAST);
  52.     TING = 0;
  53.     RING = 0;
  54.     TEND = 1;
  55.     REND = 0;
  56.     TCNT = 0;
  57.     RCNT = 0;
  58.     TIM2_Init();
  59. }

  60. //读取串口手机
  61. //返回0 数据无效;返回1 数据有效
  62. //*s 当返回为1 *s数据有效
  63. //注:在车里程序需不停扫描数据,否则会丢数据
  64. unsigned char UartSoft_Getc(unsigned char *s)
  65. {
  66. unsigned char St=0;
  67.     if (REND)
  68.     {
  69.         REND = 0;
  70.         *s = RBUF;
  71.         St = 1;
  72.     }
  73.     else { *s=0xFF; }
  74.     return St;
  75. }

  76. //发送数据需间隔一定时间 否则出错
  77. void UartSoft_Putc(unsigned char s)
  78. {
  79.     if (TEND)
  80.     {
  81.         TEND = 0;
  82.         TBUF = s;
  83.         TING = 1;
  84.     }
  85. }

  86. //定时器中断读取程序
  87. void UartSoft_Tim(void)
  88. {
  89.     if (RING)
  90.     {
  91.         if (--RCNT == 0)
  92.         {
  93.             RCNT = 3;                   //reset send baudrate counter
  94.             if (--RBIT == 0)
  95.             {
  96.                 RBUF = RDAT;            //save the data to RBUF
  97.                 RING = 0;               //stop receive
  98.                 REND = 1;               //set receive completed flag
  99.                 UartSoft_Putc(RBUF);
  100.             }
  101.             else
  102.             {
  103.                 RDAT >>= 1;
  104.                 if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer
  105.             }
  106.         }
  107.     }
  108.     else if (!RXB)
  109.     {
  110.         RING = 1;                       //set start receive flag
  111.         RCNT = 4;                       //initial receive baudrate counter
  112.         RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
  113.     }

  114.     if (--TCNT == 0)
  115.     {
  116.         TCNT = 3;                       //reset send baudrate counter
  117.         if (TING)                       //judge whether sending
  118.         {
  119.             if (TBIT == 0)
  120.             {
  121.                 TXB(0);                //send start bit
  122.                 TDAT = TBUF;            //load data from TBUF to TDAT
  123.                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
  124.             }
  125.             else
  126.             {
  127. //                TDAT >>= 1;             //shift data to CY
  128.                 if (--TBIT == 0)
  129.                 {
  130.                     TXB(1);
  131.                     TING = 0;           //stop send
  132.                     TEND = 1;           //set send completed flag
  133.                 }
  134.                 else
  135.                 {
  136.                     if(TDAT&0x01){  TXB(1); }
  137.                     else         {  TXB(0); }
  138.                     TDAT >>= 1;
  139.                 }
  140.             }
  141.         }
  142.     }
  143. }

复制代码

出0入0汤圆

发表于 2019-5-19 13:26:59 | 显示全部楼层
嗯,这是一个思路,谢谢啊

出0入0汤圆

发表于 2019-6-3 06:54:46 来自手机 | 显示全部楼层
好东西,谢谢!

出0入0汤圆

发表于 2019-7-23 13:05:30 | 显示全部楼层
谢谢大家的分享!

出0入0汤圆

发表于 2019-8-30 18:24:23 | 显示全部楼层
我来 Mark 下资源,最近有这需求,无奈片子资源不够,只能委屈求全了

出0入0汤圆

发表于 2020-11-3 17:34:42 | 显示全部楼层
正有手上有项目要用到模拟串口
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表