OpenEdv-开源电子网

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

关于STM32f103c8t6 程序问题急急急

[复制链接]

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
发表于 2021-7-29 21:47:18 | 显示全部楼层 |阅读模式
本帖最后由 gdqxp 于 2021-7-29 21:51 编辑

恳请大虾帮看看,程序STM32VET6 可以使用,但修改到C8T6里面死活不行;
下面是红外遥控的代码,还请大虾帮看看哪里写错了,死活不出来
  1. <div class="blockcode"><blockquote>#include "remote.h"
  2. #include "delay.h"


  3. //红外遥控初始化
  4. //设置IO以及定时器4的输入捕获
  5. void Remote_Init(void)                              
  6. {  
  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         NVIC_InitTypeDef NVIC_InitStructure;
  9.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  10.         TIM_ICInitTypeDef  TIM_ICInitStructure;  
  11. //        PA15,PB3,PA2,PA3部分重映像:
  12. //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   //复用
  13. //  GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);//重映像PA15,PB3,PA2,PA3
  14.        
  15.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);        //TIM4 时钟使能
  16.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO,ENABLE); //使能PORTB时钟
  17.         //PA0,PA1,PB10,PB11部分重映像:
  18. //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   //复用
  19.   GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE);//重映像PA0,PA1,PB10,PB11
  20.        

  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //PB9 输入
  22.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;      //复用推挽输出
  23.         GPIO_InitStructure.GPIO_Pull = GPIO_Mode_IPD;                 //上拉输入
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  26.         GPIO_SetBits(GPIOA,GPIO_Pin_1);        //初始化GPIOB.9
  27.        
  28.                                                   
  29.         TIM_TimeBaseStructure.TIM_Period = 10000; //设定计数器自动重装值 最大10ms溢出  
  30.         TIM_TimeBaseStructure.TIM_Prescaler =(72-1);         //预分频器,1M的计数频率,1us加1.                  
  31.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  32.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

  33.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx

  34.   TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  // 选择输入端 IC4映射到TI4上
  35.   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  36.   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  37.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  38.   TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
  39.   TIM_ICInit(TIM2, &TIM_ICInitStructure);//初始化定时器输入捕获通道

  40.   TIM_Cmd(TIM2,ENABLE );         //使能定时器4

  41.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM3中断
  42.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级0级
  43.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  44.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  45.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器       

  46.         TIM_ITConfig( TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允许更新中断 ,允许CC4IE捕获中断                                                                 
  47. }

  48. //遥控器接收状态
  49. //[7]:收到了引导码标志
  50. //[6]:得到了一个按键的所有信息
  51. //[5]:保留       
  52. //[4]:标记上升沿是否已经被捕获                                                                  
  53. //[3:0]:溢出计时器
  54. u8         RmtSta=0;                    
  55. u16 Dval;                //下降沿时计数器的值
  56. u32 RmtRec=0;        //红外接收到的数据                               
  57. u8  RmtCnt=0;        //按键按下的次数          
  58. //定时器4中断服务程序         
  59. void TIM2_IRQHandler(void)
  60. {                              

  61.         if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  62.         {
  63.                 if(RmtSta&0x80)                                                                //上次有数据被接收到了
  64.                 {       
  65.                         RmtSta&=~0X10;                                                        //取消上升沿已经被捕获标记
  66.                         if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;        //标记已经完成一次按键的键值信息采集
  67.                         if((RmtSta&0X0F)<14)RmtSta++;
  68.                         else
  69.                         {
  70.                                 RmtSta&=~(1<<7);                                        //清空引导标识
  71.                                 RmtSta&=0XF0;                                                //清空计数器       
  72.                         }                                                                                   
  73.                 }                                                            
  74.         }
  75.         if(TIM_GetITStatus(TIM2,TIM_IT_CC2)!=RESET)
  76.         {          
  77.                 if(RDATA)//上升沿捕获
  78.                 {
  79.                           TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);                                                //CC4P=1        设置为下降沿捕获
  80.                         TIM_SetCounter(TIM2,0);                                                        //清空定时器值
  81.                         RmtSta|=0X10;                                                        //标记上升沿已经被捕获
  82.                 }else //下降沿捕获
  83.                 {
  84.                         Dval=TIM_GetCapture2(TIM2);                                        //读取CCR4也可以清CC4IF标志位
  85.                   TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising);                                //CC4P=0        设置为上升沿捕获
  86.                         if(RmtSta&0X10)                                                        //完成一次高电平捕获
  87.                         {
  88.                                 if(RmtSta&0X80)//接收到了引导码
  89.                                 {
  90.                                        
  91.                                         if(Dval>300&&Dval<800)                        //560为标准值,560us
  92.                                         {
  93.                                                 RmtRec<<=1;                                        //左移一位.
  94.                                                 RmtRec|=0;                                        //接收到0          
  95.                                         }else if(Dval>1400&&Dval<1800)        //1680为标准值,1680us
  96.                                         {
  97.                                                 RmtRec<<=1;                                        //左移一位.
  98.                                                 RmtRec|=1;                                        //接收到1
  99.                                         }else if(Dval>2200&&Dval<2600)        //得到按键键值增加的信息 2500为标准值2.5ms
  100.                                         {
  101.                                                 RmtCnt++;                                         //按键次数增加1次
  102.                                                 RmtSta&=0XF0;                                //清空计时器               
  103.                                         }
  104.                                 }else if(Dval>4200&&Dval<4700)                //4500为标准值4.5ms
  105.                                 {
  106.                                         RmtSta|=1<<7;                                        //标记成功接收到了引导码
  107.                                         RmtCnt=0;                                                //清除按键次数计数器
  108.                                 }                                                 
  109.                         }
  110.                         RmtSta&=~(1<<4);
  111.                 }                                                                                                            
  112.         }
  113.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update|TIM_IT_CC2);                     
  114. }

  115. //处理红外键盘
  116. //返回值:
  117. //         0,没有任何按键按下
  118. //其他,按下的按键键值.
  119. u8 Remote_Scan(void)
  120. {        
  121.         u8 sta=0;      
  122.     u8 t1,t2;  
  123.         if(RmtSta&(1<<6))//得到一个按键的所有信息了
  124.         {
  125.             t1=RmtRec>>24;                        //得到地址码
  126.             t2=(RmtRec>>16)&0xff;        //得到地址反码
  127.             if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址
  128.             {
  129.                 t1=RmtRec>>8;
  130.                 t2=RmtRec;        
  131.                 if(t1==(u8)~t2)sta=t1;//键值正确         
  132.                 }   
  133.                 if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了
  134.                 {
  135.                          RmtSta&=~(1<<6);//清除接收到有效按键标识
  136.                         RmtCnt=0;                //清除按键次数计数器
  137.                 }
  138.         }  
  139.     return sta;
  140. }











复制代码

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

使用道具 举报

4

主题

896

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4309
金钱
4309
注册时间
2019-9-4
在线时间
896 小时
发表于 2021-7-30 10:50:09 | 显示全部楼层
仿真调试下看看,确认移植过来后正常使用了,再看看延时对不对,之前有人移植后延时就变了
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2021-7-30 13:55:03 | 显示全部楼层
延时也是对的,就直接修改了下内存的大小,别的什么也没有变。大虾帮我看看上面修改的程序有错吗
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2021-7-30 14:15:54 | 显示全部楼层
不行是为啥不行?解码出错?还是程序卡死?
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2021-7-31 12:55:56 | 显示全部楼层
我是直接通过正点原子的程序修改的,把PB9直接修改到PA1,程序下进去按遥控器一点反应也没有
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2021-8-20 16:42:36 | 显示全部楼层
A571157242 发表于 2021-7-30 10:50
仿真调试下看看,确认移植过来后正常使用了,再看看延时对不对,之前有人移植后延时就变了

在吗?我想请教下啊,定时器定时10US;为什么工作一段时间后定时器就停掉了啊,定时器定时10us和滴答定时器定时的主要区别是什么啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 02:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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