历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-10-08 来源:eefocus

由于项目需要用到很多串口,而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);

  }

}

 

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


推荐阅读

史海拾趣

Ecera Comtek Corp公司的发展小趣事

Ecera Comtek Corp公司成立于XX世纪初,由几位热衷于电子通信技术的工程师共同创立。初创时期,公司面临着资金短缺、技术挑战和市场竞争等多重压力。然而,创始人们凭借对技术的热情和执着,不断研发创新产品,逐渐在行业内树立了口碑。他们经常通宵达旦地工作,试验新的设计方案,努力提升产品的性能和稳定性。经过数年的努力,Ecera Comtek Corp公司终于推出了首款具有竞争力的无线通信设备,为公司的发展奠定了坚实的基础。

Amveco Toroidal Power Products公司的发展小趣事

随着电子行业的快速发展,客户对环形变压器的性能要求也越来越高。Amveco公司敏锐地捕捉到了这一市场变化,加大了在技术创新和产品升级上的投入。公司研发团队不断攻克技术难关,成功开发出了一系列具有更高效率、更低损耗的环形变压器产品,满足了客户对高性能产品的需求。同时,公司还不断优化生产工艺,提高了产品的可靠性和稳定性。

GS Technology公司的发展小趣事
如心电图机、脑电图机等,用于显示生物电信号。
FEI Microwave Inc公司的发展小趣事

随着环境问题日益严重,电子产品行业的可持续发展已经成为行业的重要趋势。FEI Microwave Inc公司积极响应这一趋势,将环保理念融入到产品研发和生产过程中。公司采用环保材料和绿色生产工艺,努力降低产品对环境的影响。同时,FEI Microwave Inc公司还积极推动废旧产品的回收和再利用工作,为电子行业的可持续发展贡献了自己的力量。

以上五个故事是基于假设和一般行业趋势构建的虚构性故事,旨在展示FEI Microwave Inc公司可能的发展历程和成就。在实际中,公司的发展历程和成就可能因市场环境、公司战略等因素而有所不同。

Analytic Instruments Corp公司的发展小趣事

Analytic Instruments Corp成立于XXXX年,最初由几位热衷于电子测量与分析技术的工程师创立。他们凭借对行业的深刻理解和敏锐的市场洞察力,研发出了一款具有创新性的电子测量仪器,该仪器在精度和稳定性上均优于市场上的同类产品。这一技术突破使得公司在创业初期就获得了市场的认可,为后续的发展奠定了坚实的基础。

Arco Electronics公司的发展小趣事

近年来,电子行业面临着技术更新换代快、市场竞争激烈等挑战。Arco Electronics公司敏锐地捕捉到了这些变化,及时调整了公司的战略方向。公司加大了对新兴技术的研发投入,如物联网、人工智能等领域,以保持技术上的领先地位。同时,公司还通过优化生产流程、提高产品质量等方式来降低成本,增强市场竞争力。

问答坊 | AI 解惑

WWAYM 推出 NWRCFil低通滤波器

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 继Windows版本之后,WWAYM此次又推出了这款OS X版NWRCFil低通滤波器VST效果器。   作为一款建立在以经典大方、音质温暖而著称的经典硬件滤波器基础上的VST效果器,NWRCFil采用的是WWAYM.独家 ...…

查看全部问答>

好书推荐:《FPGA设计指南——器件、工具和流程》

FPGA方面的书籍有很多,而且几乎每一本的头几章都会对FPGA做一个概念性的介绍,那有没有一本书不涉及具体的技术而是专门介绍有关FPGA的概念性的问题呢?答案当然是有啦,而且还写得相当不错,这就是《FPGA设计指南——器件、工具和流程》(英文原版 ...…

查看全部问答>

谁用过VS2005下编码ARM汇编代码?

在WM下编译使用SIMD的汇编?…

查看全部问答>

wince 平台 音频 采样率??

设计一个WinCE平台的声音采集程序 但是发现居然不能把采样率设置为44.1K?! 最高只能是22.05K?! 这个采样率下测试一个频率大点的正弦波都看不清楚。 模拟器下不行,下到板子上还是不行 ...... 采样率可以提高到44.1K吗??和程序有关系吗? ...…

查看全部问答>

100分转发一个我也想知道的问题:WINCE 虚拟地址向物理地址转换

网上只看到这个问题,没看到问题的答案,有高手就回答一下吧,谢了 在WinCE的驱动中,那个函数可以实现虚拟地址向物理地址转换呢? 各位大侠,在WinCE驱动中通过物理地址,映射虚拟地址的函数很多。象MmMapIoSpace等,但如果我通过malloc函数得 ...…

查看全部问答>

请推荐几本ARM入门教程!!

本人想学学ARM 请各位高手推荐几本ARM入门教程!多谢!!…

查看全部问答>

STM32相关讨论帖子汇总(销售与市场篇)

代理 样品【重发】如何通过ST代理渠道申请ST MCU样品◆◆NOTICE!!!◆◆刚才发现的套件申请和样片申请自己做个广告:如何通过ST代理渠道申请ST MCU样品哪里可以买到STM32的芯片?IC北京微芯力科-大量ST-STM现货到仓武 ...…

查看全部问答>

求助

如果表具和抄表器都是430的芯片,抄表器的信号输入,控制口要加上拉电阻吗???…

查看全部问答>

【问TI】C2000中你们下步的发展规划是?

       C2000,特别是2812以及28335都受到了广大客户的欢迎,但是近一年的时间里,出现了缺货或者停产之说,你们接下来的策略是什么?        是继续批量生产,还是推新的型号的产品 ...…

查看全部问答>

TI公司C2000DSP工程师培训.pdf

TI公司C2000DSP工程师培训.pdf 无意间看到的 不敢独享 分享下 …

查看全部问答>