历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2018年10月08日 | STM32F030模拟串口

发布者:心灵舞动 来源: eefocus关键字:STM32F030  模拟串口 手机看文章 扫描二维码
随时随地手机看文章

由于项目需要用到很多串口,而STM32F030的串口资源较少,所以需要自己写模拟串口,下面是过程。

首先进行初始化:



#define Auart1RxEXTIPort   EXTI_PortSourceGPIOA

#define Auart1RxEXTIPin   EXTI_PinSource5

#define Auart1RxLineEXTI_Line5

#define Auart1RCC   RCC_AHBPeriph_GPIOA

#define Auart1Port GPIOA

#define Auart1TxPin GPIO_Pin_6

#define Auart1RxPin GPIO_Pin_5

#define Auart1TxLow GPIO_ResetBits(Auart1Port,Auart1TxPin);

#define Auart1TxHigh GPIO_SetBits(Auart1Port,Auart1TxPin);


 

void Ausart1_init(void)

{

   GPIO_InitTypeDef GPIO_InitStructure;

   EXTI_InitTypeDef EXTI_InitStruct;

  NVIC_InitTypeDef NVIC_InitStructure;

 

  RCC->AHBENR |= Auart1RCC;

  //TX

  GPIO_InitStructure.GPIO_Pin = Auart1TxPin;//

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_Init(Auart1Port, &GPIO_InitStructure);

  //RX

  GPIO_InitStructure.GPIO_Pin = Auart1RxPin;//

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入

  GPIO_Init(Auart1Port, &GPIO_InitStructure);

 

  RCC->APB2ENR |=RCC_APB2Periph_SYSCFG;

 

  SYSCFG_EXTILineConfig(Auart1RxEXTIPort, Auart1RxEXTIPin);

  EXTI_InitStruct.EXTI_Line = Auart1RxLine;

  EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断

  EXTI_InitStruct.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStruct); 

  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;      //优先级设置比串口1优先    级低,不然会打断串口1接收,导致数据丢失

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

初始化了IO口,包括外部中断和NVIC

然后 写发送函数

 

void AnalogUart1SendOneByte(uint8_t datatoSend)

{

uint8_t i, tmp;

 

Auart1TxLow;

Tim14DelayUs(SendingDelay);

for(i = 0; i < 8; i++)

{

tmp= (datatoSend >> i) & 0x01;

if(tmp == 0)

{

Auart1TxLow;

Tim14DelayUs(SendingDelay);//0

}

else

{

Auart1TxHigh;

Tim14DelayUs(SendingDelay);//1

}

}

Auart1TxHigh;

Tim14DelayUs(SendingDelay);

}

 

其中 Tim14DelayUs()是自己用定时器14做的一个us延时,

TIM14初始化为:

 

void TIM14_Configuration(void)

{

TIM_TimeBaseInitTypeDef  TIM14_TimeBaseStructure;

RCC->APB1ENR |= RCC_APB1Periph_TIM14;

 

  TIM14_TimeBaseStructure.TIM_Period = 65535 - 1;   

  TIM14_TimeBaseStructure.TIM_Prescaler = 48 - 1;

 TIM14_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM14_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM14, &TIM14_TimeBaseStructure);

TIM_Cmd(TIM14,ENABLE);    

}

Tim14DelayUs()函数为

 

void Tim14DelayUs(__IO uint32_t nTime)

uint16_t tmp;

tmp = TIM_GetCounter(TIM14);  

if(tmp + nTime <= 65535)

while( (TIM_GetCounter(TIM14) - tmp) < nTime );

else

{

TIM_SetCounter(TIM14, 0);

while( TIM_GetCounter(TIM14) < nTime );

}

}


然后关于参数SendingDelay,是用来控制波特率的参数

计算方法如下

#define BaudRate  9600

#define SendingDelay  (1000000/BaudRate)   


然后下面函数为发送字符串函数


 

void AnalogUart1SendString(uint8_t *sData,uint8_t len)

{

  uint8_t i=0;

  for(i=0;i

  {

    AnalogUart1SendOneByte(sData[i]);

  }

}



然后到最重要的中断服务函数,由于我们采用的是模拟串口,所以我们初始化时将模拟串口的输入IO口配置为中断输入,当有数据过来是,数据下拉串口输入IO,然后出发中断服务函数。下面是中断服务函数

void EXTI4_15_IRQHandler(void)

{

uint8_t i=9;

static uint8_t temp;

  if(EXTI_GetITStatus(Auart1RxLine) != RESET)

  {

    NVIC->ICER[0]= (uint32_t)0x01 << (EXTI4_15_IRQn);//对NVIC_ICER[1]的第7位赋值1

Tim14DelayUs(30);

while(i--)

  {

  temp >>=1;

if(GPIO_ReadInputDataBit(Auart1Port, Auart1RxPin)) temp |=0x80;

Tim14DelayUs(SendingDelay);

  }

if(AUsart1Typedef.RxEn==RX_EN)

{

AUsart1Typedef.RxBuf[AUsart1Typedef.RxBufCount++] = temp; 

AUsart1Typedef.RxDelayCount  =  0;

AUsart1Typedef.RxNewDataFlag =1; 

temp=0;

}

NVIC->ISER[0] = (uint32_t)0x01 << (EXTI4_15_IRQn);

   

    EXTI_ClearITPendingBit(Auart1RxLine);

  }

}

 

标红部分为接受部分,根据自己的需要填入自己的接受数组中就好了。


关键字:STM32F030  模拟串口 引用地址:STM32F030模拟串口

上一篇:STM32的上拉和下拉电阻
下一篇:关于STM32PB3PB4如何设置成普通GPIO的配置

推荐阅读

        国庆七天,宅在家里的我在朋友圈去完了浪漫的东京、巴黎、土耳其,还顺便欣赏了迈阿密和洛杉矶。虽然穷是我不愿意去旅游的唯一理由,但我还是一个坚定的假期出游“劝退党”,除了人山人海的糟糕体验,天价的十一机票(qiong)也是我望而退步的主要原因。        对我来说,选择特价机票出行,不仅可以避开假期,还能将省下来的价...
前文已经介绍创建一个简单的F103RC芯片的MDK V4工程文件,下面介绍一些其它的设置项目。1:设置Output 和List的输出目录。在上文中(如下图)STM32100E-EVAL这个文件夹就是原工程文件设置的Output和List输出目录。但是我已经将项目改为“MySTM32”, 显然我要搞个我自己命名的文件来用作Output和list的输出目录。先在MDK-ARM文件夹下新建一个文件夹叫:Out...
据发那科官网信息显示,发那科创始人稻叶清右卫门于2020年10月2日(星期五)逝世,享年95岁。稻叶清右卫门,1925年3月出生于日本茨城县,1946年毕业于东京大学第二工学部精密工学科,后进入富士通,1972年创办发那科,带领公司成为世界最大的数控系统制造商。图片来源:OFweek维科网上世纪70年代后期,日本机床工业大发展,一家传奇公司功不可没——发那科...
  ABB 推出一款创新的一体化电动汽车充电桩——Terra 360,为市场带来最快的充电体验。ABB的新型Terra 360是一款模块化充电桩,可通过动态配电同时为多达四辆车充电。这意味着,车主们可利用该充电桩自带的多个充电***同时充电,从而减少排队等候充电的时间。这款新型充电桩的最大输出功率为360 kW,可以在15分钟内为任何一辆电动汽车完成充电,以...

史海拾趣

问答坊 | AI 解惑

无线环境监测系统设计及关键技术分析

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 无线环境监测系统设计及关键技术分析  …

查看全部问答∨

研发人越来越多,我工作越来越累了

这是为什么呢? 公司研发团队从10多人到现在45人,但我工作确实以前更多了。…

查看全部问答∨

求ARM在WINCE下的视频教程

小弟初学ARM 想问下有没有基于WINCE的教程 给个链接也行 麻烦了~…

查看全部问答∨

希望有经验的各位能给点建议

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 今年要参加TI杯设计大赛,希望有经验的各位能给点建议,我应该怎么做??  …

查看全部问答∨

自制PC机键盘无法完成自检?单片机高手请进

系统上电后PC机提示找不到KEYBOARD 高手帮忙看看!主程序部分,这样写有问题吗? void main() {       BYTE RcvPc; //定时器0初始化             TMOD=0x01;   &nbs ...…

查看全部问答∨

再次上传我的原理图哈

回去想想搞个又简又实用地,保证和平30年,不带坏地…

查看全部问答∨

IIC写的问题

我用MSP430F169的IIC口给液晶送数据,调试时,单步运行正常显示,连续运行则显示出错,而且每次错误都是一样的,请问各位大侠,这可能是什么原因啊?…

查看全部问答∨

51单片机与彩色触摸屏的问题,求大神指教

51单片机能用7寸左右的彩色触摸屏吗?求大神帮忙,谢谢了!…

查看全部问答∨

Beaglebone外围电路设计:换成7寸的LCD!!

活动结束快一周了!!昨天淘到一款群创的7寸LCD屏!感觉原来的LCD小了点!!于是决定换成这款7寸的LCD! 型号为:AT070TN92(50pin) 手册里介绍的背光电压处理稍稍复杂一些!幸好卖家给提供了转成AT070TN83 V.1 40pin接口的转接板! 由手册可 ...…

查看全部问答∨

关于用电突然间转不过来弯了

本帖最后由 dontium 于 2015-1-23 11:39 编辑 请问220V、1A的负载,为什么算功率是以小时为主单位,而不是以秒。秒不是时间的主单位吗? …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved