历史上的今天
今天是: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);
}
}
标红部分为接受部分,根据自己的需要填入自己的接受数组中就好了。
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 继Windows版本之后,WWAYM此次又推出了这款OS X版NWRCFil低通滤波器VST效果器。 作为一款建立在以经典大方、音质温暖而著称的经典硬件滤波器基础上的VST效果器,NWRCFil采用的是WWAYM.独家 ...… 查看全部问答> |
|
FPGA方面的书籍有很多,而且几乎每一本的头几章都会对FPGA做一个概念性的介绍,那有没有一本书不涉及具体的技术而是专门介绍有关FPGA的概念性的问题呢?答案当然是有啦,而且还写得相当不错,这就是《FPGA设计指南——器件、工具和流程》(英文原版 ...… 查看全部问答> |
|
设计一个WinCE平台的声音采集程序 但是发现居然不能把采样率设置为44.1K?! 最高只能是22.05K?! 这个采样率下测试一个频率大点的正弦波都看不清楚。 模拟器下不行,下到板子上还是不行 ...... 采样率可以提高到44.1K吗??和程序有关系吗? ...… 查看全部问答> |
|
100分转发一个我也想知道的问题:WINCE 虚拟地址向物理地址转换 网上只看到这个问题,没看到问题的答案,有高手就回答一下吧,谢了 在WinCE的驱动中,那个函数可以实现虚拟地址向物理地址转换呢? 各位大侠,在WinCE驱动中通过物理地址,映射虚拟地址的函数很多。象MmMapIoSpace等,但如果我通过malloc函数得 ...… 查看全部问答> |
|
代理 样品【重发】如何通过ST代理渠道申请ST MCU样品◆◆NOTICE!!!◆◆刚才发现的套件申请和样片申请自己做个广告:如何通过ST代理渠道申请ST MCU样品哪里可以买到STM32的芯片?IC北京微芯力科-大量ST-STM现货到仓武 ...… 查看全部问答> |
|
C2000,特别是2812以及28335都受到了广大客户的欢迎,但是近一年的时间里,出现了缺货或者停产之说,你们接下来的策略是什么? 是继续批量生产,还是推新的型号的产品 ...… 查看全部问答> |




