由于项目需要用到很多串口,而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);
}
}
标红部分为接受部分,根据自己的需要填入自己的接受数组中就好了。
上一篇:STM32的上拉和下拉电阻
下一篇:关于STM32PB3PB4如何设置成普通GPIO的配置
推荐阅读
史海拾趣
ADL Embedded Solutions Inc. 是一家专注于嵌入式计算解决方案的公司,以下是该公司发展的五个相关故事:
公司创立与早期发展: ADL Embedded Solutions Inc. 成立于1994年,总部位于美国科罗拉多州科罗拉多斯普林斯市。公司初期致力于为工业、军事、航空航天等领域提供嵌入式计算解决方案。其产品包括工业级嵌入式计算板卡、系统、模块等。
技术创新与产品推出: ADL 在嵌入式计算领域不断进行技术创新,并推出了多款具有竞争力的产品。公司的产品具有高性能、低功耗、高可靠性等特点,得到了客户的广泛认可。其产品广泛应用于军事航空、医疗、交通、工业自动化等领域。
客户合作与项目案例: ADL 与各行业的领先企业建立了长期稳定的合作关系,并参与了众多重要项目。例如,公司为航空航天领域的客户提供了符合严格标准的嵌入式计算解决方案,为医疗设备制造商提供了可靠的嵌入式计算板卡等。
全球市场拓展与国际化发展: ADL 通过不断拓展国内外市场,实现了全球化发展。公司在美国、欧洲和亚洲等地设有销售办事处和服务中心,为客户提供本地化的技术支持和服务。同时,ADL 的产品远销全球各地,深受国际客户的青睐。
未来展望与持续发展: ADL 将继续致力于技术创新和产品开发,满足客户不断变化的需求。公司将不断扩大在工业、军事、医疗等领域的市场份额,加强与客户的合作,保持行业领先地位,实现业务的持续增长和发展。
随着全球对环境保护和社会责任的日益关注,Carlo Gavazzi公司也积极承担起自己的社会责任。公司致力于开发环保型产品和技术,推动可持续发展。同时,公司还积极参与社会公益活动,回馈社会,赢得了广泛的社会认可和尊重。
这五个故事只是Carlo Gavazzi公司发展历史中的一部分,但它们足以展示这家公司在电子行业中的奋斗、创新和成功。作为一家具有悠久历史和深厚底蕴的企业,Carlo Gavazzi公司将继续在未来的发展中书写新的篇章。
为了进一步扩大市场份额和增强技术实力,DATASENSOR公司积极进行收购和扩张。2004年,公司成功收购INFRA和SPECIALVIDEO公司,这两家公司在工业自动化领域拥有丰富的经验和先进的技术,为DATASENSOR公司带来了更多的市场机会和技术优势。此外,公司还在法国、德国、英国和西班牙等国家和地区设立了子公司,实现了全球化的战略布局。
统宇电研深知品质对于企业的重要性,因此一直将品质管理作为公司的核心竞争力之一。公司建立了严格的品质管理体系,从原材料采购到产品出厂的每一个环节都进行严格把关。同时,统宇电研还注重员工品质意识的培养和提高,通过培训和实践相结合的方式不断提升员工的品质素养。这些努力使得统宇电研的产品品质得到了客户的广泛认可。
为了应对市场需求的多样化,GSR Technology Ltd开始实施多元化产品策略。公司在保持GSR技术领先的同时,逐步向汽车电子、智能家居、安全监控等领域拓展。通过技术创新和定制化解决方案,公司成功推出了多款具有市场竞争力的电子产品,进一步拓宽了市场份额。同时,公司加强市场营销和品牌建设,提升了品牌知名度和美誉度。
背景:霍尼韦尔公司的历史可以追溯到1885年,由发明家艾伯特·布兹在美国明尼阿波利斯创立布兹电子温度调节器公司。
发展:布兹成功研发出了一种名为“风门挡板”的装置,该装置能够自动调节室内温度,这是当时的一大技术突破。随着业务的不断发展,布兹电子温度调节器公司被统一温度控制公司收购,并在1893年更名为电子供热调节器公司。
关键事件:1898年,电子供热调节器公司被W.R. Sweatt收购,并于1916年更名为明尼阿波利斯热调节器公司。这一系列的更名和收购奠定了霍尼韦尔在恒温器领域的基础。
系统上电后PC机提示找不到KEYBOARD 高手帮忙看看!主程序部分,这样写有问题吗? void main() { BYTE RcvPc; //定时器0初始化 TMOD=0x01; &nbs ...… 查看全部问答∨ |
|
活动结束快一周了!!昨天淘到一款群创的7寸LCD屏!感觉原来的LCD小了点!!于是决定换成这款7寸的LCD! 型号为:AT070TN92(50pin) 手册里介绍的背光电压处理稍稍复杂一些!幸好卖家给提供了转成AT070TN83 V.1 40pin接口的转接板! 由手册可 ...… 查看全部问答∨ |
本帖最后由 dontium 于 2015-1-23 11:39 编辑 请问220V、1A的负载,为什么算功率是以小时为主单位,而不是以秒。秒不是时间的主单位吗? … 查看全部问答∨ |