历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2020年01月21日 | stm8 串口模拟接收

2020-01-21 来源:eefocus

我用的是PD4引脚


需要一个引脚中断和一个定时器产生波特率


用的定时器2模拟的波特率


有点小问题,就是第一次的第一个数据会少移动一位,但是后面数据又是正常的 = =


异常数据:84 4D 00 1C 00 0E 00 10 00 15 00 0E 00 10 00 15 09 F9 02 B8 00 3C 00 06 00 04 00 01 71 00 03 85 


正常数据:42 4D 00 1C 00 0E 00 10 00 15 00 0E 00 10 00 15 09 F9 02 B8 00 3C 00 06 00 04 00 01 71 00 03 85 


#define SIMULATION_UART_DATA_SIZE 32

 

u8 simulationUartData[32];

static u8 tim2_updata_count = 0;

static u8 tim2_data_count = 0;

static volatile u8 uartData = 0;

 

void simulationUartReceiveInit(void)

{

  TIM2->PSCR=0x04;//16分频,定时器时钟等于系统时钟=1m

  TIM2->ARRH=0x00;//一定要先装高八位,再装低八位

  TIM2->ARRL=0x68;//1ms重装值16000,这是个坑,技术手册里说tim2是向上计数,其实是向下计数的

  TIM2->CNTRH=0x00;

  TIM2->CNTRL=0x00;//有必要清除下计数器

  TIM2->IER = 0x01; // 允许更新中断

 

  TIM2->CR1 = 0x00; // 计数器使能,暂停计数

}

void uart2Init(void)

{

    UART2_DeInit();

    UART2_Init((u32)9600, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO , UART2_SYNCMODE_CLOCK_DISABLE , UART2_MODE_TXRX_ENABLE);

    UART2_Cmd(ENABLE);

 //   UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);

    

}

 

void inerDelay_us(unsigned char n)  //改为延时1US

{

  for(;n>0;n--) 

  { 

      asm("nop");  //在STM8里面,16M晶振,_nop_() 延时了 333ns

      asm("nop");  

      asm("nop");  

      asm("nop");  

  }

}

 

void main(void)

{

  /*设置内部高速时钟16M为主时钟*/ 

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M  

  uart2Init();

  simulationUartReceiveInit();

  

  GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);

  

  EXTI_DeInit();

  EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);

  

  enableInterrupts(); 

 

  for(;;)

  {

 

  }

}

 

#pragma vector=8

__interrupt void EXTI_PORTD_IRQHandler(void)

{

  if( 0 ==(GPIO_ReadInputPin(GPIOD,GPIO_PIN_4)) )

  {

    GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT);//设置为浮空输入

    uartData = 0;

    tim2_updata_count = 0;

    TIM2->CNTRH=0x00;

    TIM2->CNTRL=0x00;//有必要清除下计数器

    inerDelay_us(60);

    TIM2->CR1 = 0x01; // 计数器使能,

  }

}

 

#pragma vector=15

__interrupt void TIM2_IRQHandler(void) 

{

  TIM2_ClearFlag( TIM2_FLAG_UPDATE);

  uartData>>=1;

  tim2_updata_count++;

  

  if(GPIO_ReadInputPin(GPIOD,GPIO_PIN_4) == 1 )

  {

    uartData|=0x80;

  }

  

  if(8 == tim2_updata_count)

  {

    UART2_SendData8(uartData);

    simulationUartData[tim2_data_count] = uartData;

    tim2_updata_count = 0;

    GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);

    EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);

    TIM2->CR1 = 0x00; // 计数器使能,暂停计数

    tim2_data_count++;

    if(tim2_data_count == 32)

    {

      tim2_data_count = 0;

    }

    

  }

}

 

PUTCHAR_PROTOTYPE

{

  /* Write a character to the UART2 */

  UART2_SendData8(c);

  /* Loop until the end of transmission */

  while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET);

 

  return (c);

}

 

GETCHAR_PROTOTYPE

{

#ifdef _COSMIC_

  char c = 0;

#else

  int c = 0;

#endif

  /* Loop until the Read data register flag is SET */

  while (UART2_GetFlagStatus(UART2_FLAG_RXNE) == RESET);

    c = UART2_ReceiveData8();

  return (c);

}


推荐阅读

史海拾趣

General Microcircuits Corp公司的发展小趣事
在电桥和放大器电路中,使用高精度、低温度系数的电阻来减小因电阻变化引起的直流偏移。
Hind Rectifiers Ltd公司的发展小趣事
选择低噪声的运算放大器,以提高系统的信噪比。
Greenwich Instruments Ltd公司的发展小趣事

随着全球对环境保护和可持续发展的重视,Greenconn Corp积极响应号召,将绿色理念融入产品设计和生产全过程。公司致力于开发环保型连接器产品,采用可回收材料、减少能源消耗和废弃物排放等措施,努力实现生产过程的绿色化。同时,Greenconn Corp还积极参与行业内的绿色标准制定和认证工作,为推动整个电子行业的绿色发展贡献了自己的力量。

Genisco Electronics公司的发展小趣事
对互投电路中的设备进行定期检查和维护,确保其处于良好状态。
Acmelux Taiwan Inc公司的发展小趣事

面对日益激烈的国际竞争,Acmelux Taiwan Inc公司积极实施全球化战略布局。公司先后在欧美、亚洲等地设立了研发中心和生产基地,以充分利用全球资源,提升公司的整体竞争力。通过与当地企业的合作与交流,Acmelux不仅拓展了国际市场,还吸收了大量先进的技术和管理经验,为公司的持续发展注入了新的活力。

E-Switch公司的发展小趣事

E-Switch公司始终坚持以客户为中心的经营理念,致力于为客户提供优质的服务和产品。公司建立了完善的客户服务体系,及时解决客户在使用过程中遇到的问题。同时,E-Switch还积极与客户保持沟通交流,了解市场需求变化,以便及时调整产品策略和生产计划。正是这种以客户至上的经营理念和持续发展的战略眼光,让E-Switch在电子行业中不断发展壮大。

问答坊 | AI 解惑

「魔力狮」汽车玻璃修补设备——助您“破镜重圆”

美国「魔力狮」汽车玻璃修补设备——助您“破镜重圆”       「魔力狮公司位于上海市,全市范围内对车主均可预约服务,专业汽车玻璃修补、车身凹陷修复、玻璃划痕处理、汽车内室翻新、车漆划伤局部修补,同时对外诚招加盟 ...…

查看全部问答>

ARM软件模拟硬件环境软件

本人太穷买不起1000+的板子,现请教高手介绍一款纯软件模拟硬件的软件,可以下载啊,跑程序啊 不知道有没有这种软件 [ 本帖最后由 frozenrain 于 2008-7-7 17:40 编辑 ]…

查看全部问答>

嵌入式C语言编程和普通windows下的C语言编程有什么区别?

嵌入式编程用的最多的也是C语言,和普通的windows下的C编程不同的就是,比如应用层开发,嵌入式开发出来的应用程序最终不是要运行在PC上的,而是目标板。所以嵌入式开发就一定会有交叉编译这个环节(简单一点理解就是,在PC下编程,然后交叉编译一 ...…

查看全部问答>

用AT89S51制作可修改密码的密码锁

一款用AT89S51制作可修改密码的密码锁电路!…

查看全部问答>

linux如何安装QQ

linux 下原有的 QQ插件一般情况下都不能使用 ,我们可以使用 Eva虽然界面不是非常华丽,但是可以正常使用 , QQ建议选择Eva,下载地址:ftp://ftp.fedora.cn/pub/fedora-cn/linux/7/i386/ rpm -ivh eva-0.4.9-0.20070723.fc7.fcn.y5.i386.rpm p ...…

查看全部问答>

大家看看使用单片机如何测量电阻值?

普通I/O口实现测量可调电阻,调节LED的闪烁频率!      相信大家都见过用普通I/O口测量电阻方案,一直以来没有亲自动手制作.今天终于制作成功!实现用普通I/O测量可调电阻,调节LED闪烁频率!现与大家一起分享! 来源:PIC单片机交 ...…

查看全部问答>

LTC电源管理芯片

LTC电源管理芯片…

查看全部问答>

VC应用程序调用驱动程序中的函数

公司要我做一个应用 程序去调用 驱动 程序中的函数,自己查了资料 现在还是没法入手,请各位大哥帮帮忙,应用程序用VC做,驱动程序以经包在系统中下到板子中了,系统是wince5.0, 驱动程序是看门狗,硬件2440…

查看全部问答>

白给分了啊~!

谁能帮我找到用C++或者C#开发的基于windows mobile手机版的中国象棋,或者国际象棋,再或者贪吃蛇、俄罗斯方块等这些游戏的源代码,只要能够编译通过,在模拟器上可以运行就给分,下载地址也好,哪怕是买也好,大家帮帮忙吧,急用!!!谢谢了! 把 ...…

查看全部问答>

32K的FLASH做电子设计需要外扩吗?

另外问下,怎么看代码的总大小?一条代码多大?我的开发环境是IAR.…

查看全部问答>