OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10413|回复: 11

IO端口模拟串口

[复制链接]

28

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
491
金钱
491
注册时间
2012-8-9
在线时间
57 小时
发表于 2014-11-13 17:21:27 | 显示全部楼层 |阅读模式

下午的时候,由于板子串口就三个不够用,随即就模拟了一个串口,参考网上一位网友的51代码,然后自己加入了外部中断检测;因为就用到接收,所以发送没测试过;波特率是9600。


u8 fTimeouts=0;
u8 SimUart_RecFlag=0;
#define TIMER_ENABLE() {TIM1->CR1|=0x01;fTimeouts=0;}
#define TIMER_DISABLE() {TIM1->CR1&=0xfe;fTimeouts=0;}
#define TIMER_WAIT() {while(!fTimeouts);fTimeouts=0;}

#define EXTI_ENABLE() {EXTI_ClearITPendingBit(EXTI_Line14);EXTI->IMR=1<<14;}
#define EXTI_DISABLE() {EXTI_ClearITPendingBit(EXTI_Line14);EXTI->IMR=0<<14;}



void TIM1_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //?±??????
 
 //?¨?±?÷TIM3??????
 TIM_TimeBaseStructure.TIM_Period = arr; //?è???????????ü??????×°????????×?????×°???????÷???????? 
 TIM_TimeBaseStructure.TIM_Prescaler =psc; //?è??????×÷??TIMx?±?????????????¤·?????
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //?è???±??·???:TDTS = Tck_tim
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?ò??????????
 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //?ù?????¨????????????TIMx???±???ù??????
 
 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //???????¨??TIM3????,???í?ü??????

 //??????????NVIC?è??
 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM3????
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //??????????0??
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //????????3??
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??±?????
 NVIC_Init(&NVIC_InitStructure);  //??????NVIC?????÷

// TIM1->CR1&=0xfe;
 TIM_Cmd(TIM1, DISABLE);  //????TIMx  
 TIM_ClearFlag(TIM1, TIM_FLAG_Update); 
}
void SimUart(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 EXTI_InitTypeDef  EXTI_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //????PB,PE?????±??
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //?????????????±??
 
 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;     //LED0-->B.5 ????????
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //???ì????
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO????????50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);      //?ù???è?¨??????????GPIOB.5
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;     //LED0-->B.5 ????????
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //???ì????
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO????????50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);      //?ù???è?¨??????????GPIOB.5
 GPIO_SetBits(GPIOA,GPIO_Pin_14);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//??????????3
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //×???????3
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ?¨??????
 NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷
 

  //GPIOE.2 ?????????°??????????????   ????????·?
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource14);

   EXTI_InitStructure.EXTI_Line=EXTI_Line14; //KEY2
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
   EXTI_Init(&EXTI_InitStructure);   //?ù??EXTI_InitStruct?????¨???????????????èEXTI?????÷

 
}
u8 SimUart_RecByte(void)
{
 u8 i;
 u8 byte=0;
 
 TIMER_ENABLE();
 TIMER_WAIT();
 
 for(i=0;i<8;i++)
 {
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14)==1)
  {
   byte|=(1<<i);
  }
  
  TIMER_WAIT();
 }
 
 TIMER_WAIT();
 TIMER_DISABLE();
 
 return byte;

void SimUart_SendByte(u8 Byte)
{
 u8 i=8;
 
 GPIO_ResetBits(GPIOA,GPIO_Pin_13);
 
 TIMER_ENABLE();
 TIMER_WAIT();
 
 while(i--)
 {
  if((Byte&0x01)==1)
   GPIO_SetBits(GPIOA,GPIO_Pin_13);
  else
   GPIO_ResetBits(GPIOA,GPIO_Pin_13); 
  
  TIMER_WAIT();
  
  Byte>>=1;
 }
 
 GPIO_SetBits(GPIOA,GPIO_Pin_13);
  
 TIMER_WAIT();
 TIMER_DISABLE();
}
 
int main(void)

 u8 key;
 u16 i=0;


 delay_init();       //???±??????????  
 NVIC_Configuration();   //?è??NVIC????·?×é2:2??????????????2???ì????????
 uart_init(115200);   //?®??????????9600 
 BEEP_Init();
 SimUart();
 TIM1_Int_Init(104,71);
 while(1)
 {
  if(SimUart_RecFlag==1)
  {
   EXTI_DISABLE();
   SimUart_RecFlag=0;
   while((USART1->SR&0X40)==0);//?­?··???,?±??·????ê±?  
      USART1->DR = (u8) SimUart_RecByte();   
   EXTI_ENABLE();
  }
 }      
}

//????????0·??????ò
void EXTI15_10_IRQHandler(void)
{
 if(EXTI_GetITStatus(EXTI_Line14)!=RESET)
 {
  SimUart_RecFlag=1;
  EXTI_ClearITPendingBit(EXTI_Line14); //????LINE0????????±ê??
 }
}
//?¨?±?÷3????·??????ò
void TIM1_UP_IRQHandler(void)   //TIM3????
{
 if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  //?ì?éTIM3?ü??????·??ú??·?
  {
  TIM_ClearITPendingBit(TIM1, TIM_IT_Update  );  //????TIMx?ü??????±ê??
  fTimeouts=1;

  }
}
有用的朋友可以拿去用下,接收测试还是蛮稳定的。

今天测试了下,发送也很稳定。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-11-13 18:02:14 | 显示全部楼层
不错!谢谢分享!!!!
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2014-11-13 18:31:41 | 显示全部楼层
注释生病了么
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2014-11-13 19:52:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-11-13 20:08:36 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

85

主题

378

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2013-4-29
在线时间
87 小时
发表于 2014-11-14 08:19:41 | 显示全部楼层
谢谢分享....
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-3-8
在线时间
18 小时
发表于 2016-5-17 18:23:34 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
发表于 2016-5-31 14:50:48 | 显示全部楼层
:D
回复 支持 反对

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
发表于 2016-5-31 15:08:41 | 显示全部楼层
占坑,以后待用
回复 支持 反对

使用道具 举报

8

主题

163

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5346
金钱
5346
注册时间
2013-3-16
在线时间
628 小时
发表于 2017-3-9 17:01:40 | 显示全部楼层
源码求分享
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-5-27
在线时间
5 小时
发表于 2018-5-29 09:04:29 | 显示全部楼层
为何我用了你的代码,中断根本一点反应都没有
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2022-4-25
在线时间
5 小时
发表于 2022-7-28 21:04:41 | 显示全部楼层
你这主函数写的啥啊,为啥还用串口呢?不是用io模拟串口吗?还有你那个延时怎么回事啊,怎么延时为0?没看懂。没有测试成功
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 09:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表