STM32F030模拟串口

发布者:心灵舞动最新更新时间:2018-10-08 来源: 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的配置

推荐阅读最新更新时间:2024-03-16 16:15

关于STM32 利用IO口模拟串口实现数据通信
网上有好多关于利用IO口来实现串口数据收发的实例,这种方法的实质都是可以应用于任何一款微处理器上,而不仅仅局限于stm32。有相关的源代码链接参考: https://github.com/TonyIOT/SoftWareSerial 当然,如果成本要求不高,可以利用串口扩展芯片是最方便的,如CH438,WK系列芯片等。 IO口模拟串口的一些基本原理,阐述如下: STM32单片机一般少则3个串口,多则5个,而项目还偏偏5个硬件串口还是不够用.板子上有几个预留IO口,可以用来模拟串口. 模拟串口一般都选9600,速度最快试了也才19200,所以限制还是较多的,一般不得以情况下才会用到. IO口模拟串口的思路也比较简单,
[单片机]
STM32F030使用RTC周期性唤醒STOP模式
首先,F030与F072的RTC唤醒功能是不一样的,在相关定义文件stm32f0xx_exti.h中有如下定义: #define EXTI_Line17 ((uint32_t)0x00020000) /*! Internal interrupt line 17 Connected to the RTC Alarm event */ #define EXTI_Line20 ((uint32_t)0x00100000) /*! Internal interrupt line 20
[单片机]
模拟串口--基于STM8普通IO口的模拟串口驱动程序
标准串口通讯数据的格式为:起始位(1) + 数据位(8) + 校验位(1) + 停止位(1) 串口通讯另外一个重要的的部分是设置波特率,波特率就是1秒钟内串口所传输的Bit(位)数。 关于采样频率:为了较小读取或者发送串行数据的误差,我们采取了在N(我用的是4次)次中断中,取固定位置的读取的数据。 我以stm8中9600波特率计算的过程为例:(1秒钟传输9600位) 可以计算出传输1位所需要的时间 T1 = 1/9600 约为104us 由此可知,发送一位数据,定时器中断的时间间隔应为 104/4 = 26us(4倍采样频率) stm8 内部晶振频率为16M,我采用8分频也就是2M,故MCU震荡周期为 1/
[单片机]
STC15F204 模拟串口例程 简单理解
----------------------------------main.c----源文件-------------------- #include reg51.h typedef bit BOOL; typedef unsigned char BYTE; typedef unsigned int WORD; sbit RXB = P3^0; //串口模拟端口 sbit TXB = P3^1; //#define BAUD 0xF400 // 1200bps @ 11 .0592MHz //#define BAUD 0xFA00 // 2400bps @ 11 .0592MHz //#define BAUD 0xFD00
[单片机]
STM32F030学习之串口收发程序
使用USART最简单的情况是只使用3根线:Tx用于 数据发送,Rx用于数据接收,GND是信号地线,提供通信双方的参考电平。 实现的功能: 1、通过串口发送数据; 2、中断方式接收数据,并将接收到的数据回送。 首先,第一步:配置引脚,将串口映射到PA9(Tx),PA10(Rx)。 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Connect GPIOs to USART1 RX&TX */ GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1); //Tx GPIO_Pin
[单片机]
51单片机GPIO口模拟串口通信
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。 本文所说的模拟串口, 就是利用51的两个输入输出引脚P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。 以11.0592MHz的晶振为例,通过定时计数器0产生中断信号来模拟串口电平,下面附上具体源
[单片机]
STM32F030用IAR+JLINK在线调试无法下载FLASH问题
今天遇到STM32 下载问题,百度半天没找到解决办法;在此记录一笔: 环境: IAR 7.2 开发板: STM32F103C8T6 下载方式: SWD 下载失败的log大概如下: Fri Nov 14, 2014 17:22:59: ST-Link firmware too old Fri Nov 14, 2014 17:22:59: Connected to ST-Link/V2 Firmware V2.J21.S4 (Probe no: D1A2B612) Fri Nov 14, 2014 17:22:59: Selecting SWD as current target interface. Fri Nov 14, 20
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved