[创新制造展示] 【21ic第三届设计大赛】+冗余执行系统(STM32+阿里云)

[复制链接]
1744|33
 楼主 | 2019-6-5 16:08 | 显示全部楼层 |阅读模式
本帖最后由 奋斗小范 于 2019-6-10 12:57 编辑

  偶然间从朋友那听说了论坛上正在举行第三届设计大赛,决定参加一下,让我那一堆“尘封已久”的开发板“重见天日”,因为之前使用STM32F4系列做过简易示波器与信号发生器,并且相关制作教程也较多,因此选取主题B作为此次参赛题目。

首先,从我百宝箱里翻出此次比赛需要的硬件
STM32F103ZET6开发板*1,
STM32F103C8T6最小系统板*1,
4.3寸TFTLCD触摸屏*1,
电位器*1,
USB转TTL*1,
继电器*1,
绿色LED*1,
电阻、线材若干。。。。。。
还有几种模块不确定能否用上,暂时先不列出来。


先贴上确定使用的硬件:
1.png


关于此次设计我将分为五部分进行:
1)项目方案的构想;
2)设计、搭建;
3)调试流程;
4)作品展示、制作心得和总结等;
5)视频展示



使用特权

评论回复

评论

21ic小喇叭 2019-6-6 13:48 回复TA
期待 
21ic小喇叭 2019-6-6 13:48 回复TA
期待 
 楼主 | 2019-6-5 16:14 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-5 16:15 编辑

1)项目方案的构想;
①审题
此题目分为两个项目 :基础项目与加分项目。
基础项目为完成主要的控制功能,AD采样数值分为三档,与LED三种状态相对应(灭, 3Hz闪烁, 常亮),并显示AD读数与LED状态。
加分项目为冗余控制功能,当主控制器失效或异常时,从控制器能检测到主控制器异常,断开主控电源,并接管LED控制。
②构想
既然是冗余执行系统,可靠性是重中之重,因此两控制器运作必须是相互独立,互不干扰,因此排除通过通讯的方式进行控制器之间的协调。
本次设计采用双控制器独立运行的方式,
主要思路是:
主控制器通过ADC获取电位器当前状态,通过定时器控制LED闪烁,并将AD值跟LED状态显示在触摸屏上。
11.jpg
从控制器在主控制器功能基础上,增加监测功能,监测主控制器输出,在主控制器控制异常时,断开主控制器电源并接管控制,另外从控制器AD值、LED状态与主控制器状态通过串口或者其他方式上传到PC上。
222.jpg

使用特权

评论回复

评论

zhanzr21 2019-6-5 19:13 回复TA
独立工作的思路很赞, 期待后续资料! 
 楼主 | 2019-6-6 08:46 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-6 13:52 编辑

2)设计、搭建:

①搭建硬件平台。
因为本次用到的硬件均为现成模块,本次就不再做PCB。
系统示意图:
框图.jpg

搭建完成:
ps:从控制器线没连。。。
IMG_20190604_163755.jpg

②搭建软件框架。
因功能较为简单,没有过多考虑节约资源。

主控制器资源使用情况:
USART1    打印调试信息
FSMC     LCD
ADC1-CH1  电位器电压
TIM3     LED 3Hz闪烁
SPI     外部flash(存字库)
SDIO     SD卡(刷字库以及其他文件)

从控制器资源使用情况:USART1    打印调试信息
USART3    备用(后期可能加其他功能)   
ADC1-CH1  电位器电压
TIM3     定时检测主控制器状态
TIM4     LED 3Hz闪烁

使用特权

评论回复
| 2019-6-7 09:37 | 显示全部楼层
是 类似  这个 图的 功能吗 canweb001.JPG
我们 有 现成的 开发板,一个 MST 可带 99个开发板从站,
很简单就可以与 腾讯云服务器 交换数据
kfb001.JPG

使用特权

评论回复
 楼主 | 2019-6-7 10:53 | 显示全部楼层
515192147 发表于 2019-6-7 09:37
是 类似  这个 图的 功能吗
我们 有 现成的 开发板,一个 MST 可带 99个开发板从站,
很简单就可以与 腾讯 ...

不是的,不过感谢你提醒了我,搞完所要求的功能以后,考虑接入云。

使用特权

评论回复
 楼主 | 2019-6-7 17:17 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-7 17:23 编辑

3)调试流程:
①主控制器:
工程图片:
%QRLMY3IXHBV@J2XYP3M}7W.png

初始化
  1. delay_init();  
  2. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  3. uart_init(115200);
  4. LED_Init();
  5. KEY_Init();
  6. LCD_Init();
  7. Adc_Init();
  8. TIM3_Init(1666,7199);
  9. W25QXX_Init();//初始化W25Q128
  10. my_mem_init(SRAMIN);//初始化内部内存池
  11. exfuns_init();//为fatfs相关变量申请内存  
  12. f_mount(fs[0],"0:",1);//挂载SD卡
  13. f_mount(fs[1],"1:",1);//挂载FLASH.
  14. LCD_Display_Dir(1);
复制代码

主控制器LCD显示(显示简单的做了一下,另外照片画质太差请见谅

ADC采样值左侧显示,并以图形显示当前所处档位。
LED状态右侧显示,LED灭右侧框内为白色,LED闪烁框内会有绿色方块闪烁,LED常亮对应位置绿色方块常亮。
QQ图片20190607164107.png

无法显示汉字,增加字库之后:
IRLEB8HZS_2OCAKN`2G5@1N.png

ADC初始化:
  1. void  Adc_Init(void)
  2. {         
  3.         ADC_InitTypeDef ADC_InitStructure;
  4.         GPIO_InitTypeDef GPIO_InitStructure;

  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟

  6.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  9.         GPIO_Init(GPIOA, &GPIO_InitStructure);        

  10.         ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

  11.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
  12.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
  13.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
  14.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
  15.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
  16.         ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
  17.         ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
  18.   
  19.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  20.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  21.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  22.         ADC_StartCalibration(ADC1);         //开启AD校准
  23.         while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束
  24. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
  25. }
复制代码
直接在主函数中循环读取AD值:
  1. Adc_Val=Get_Adc_Average(ADC_Channel_1,100);
复制代码
将AD值显示在LCD上,并计算出相应的长度,以图形显示在屏幕上:
  1. LCD_ShowxNum(150,140,Adc_Val,4,24,0);//显示ADC的值
  2. Adc_X = 1.0*261 * Adc_Val / 4095;
  3. LCD_Fill(82,212,82+Adc_X,338,GREEN);
  4. LCD_Fill(82+Adc_X,212,343,338,WHITE);
复制代码

定时器初始化:
因此设计对时间要求不高,刷屏直接放在中断中进行。
  1. void TIM3_Init(void)
  2. {
  3.         TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
  4.         NVIC_InitTypeDef        NVIC_InitStructure;
  5.         
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  7.         
  8.         TIM_TimeBaseStructure.TIM_Period = 1666;
  9.         TIM_TimeBaseStructure.TIM_Prescaler =7199;
  10.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  11.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  12.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  13.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

  14.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  15.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  16.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  17.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  18.         NVIC_Init(&NVIC_InitStructure);

  19.         TIM_Cmd(TIM3, DISABLE);
  20. }
复制代码
通过AD采样值控制LED状态:
  1. if(Adc_Val<1365)
  2. {
  3.     TIM_Cmd(TIM3, DISABLE);
  4.     LED2=1;
  5.     LCD_Fill(502,177,673,353,WHITE);
  6. }
  7. else if(Adc_Val<2730)
  8. {
  9.     TIM_Cmd(TIM3, ENABLE);
  10. }
  11. else
  12. {
  13.     TIM_Cmd(TIM3, DISABLE);
  14.     LED2=0;
  15.     LCD_Fill(502,177,673,353,GREEN);
  16. }
复制代码

主控制器较为简单,至此功能基本完成。

使用特权

评论回复
 楼主 | 2019-6-8 11:49 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-8 11:50 编辑

一直这样发不了东西····
QQ截图20190608115007.png

使用特权

评论回复

评论

21ic小喇叭 2019-6-10 11:08 回复TA
@奋斗小范 :OK~~ 
奋斗小范 2019-6-10 11:01 回复TA
@21ic小喇叭 :串口初始化代码里面某些字符,可能认成不良信息了,把那部分删掉就可以了。。。 
21ic小喇叭 2019-6-10 09:11 回复TA
还有类似情况发生吗? 
 楼主 | 2019-6-8 11:52 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-8 12:58 编辑

②从控制器:
工程图片:
27552C6A-DD55-4182-829A-D89707EF98B9.png

初始化:
  1. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  2. Init_TIM3(1999,7199);//定时监测主控制器工作情况
  3. Init_TIM4(1666,7199);//LED闪烁控制
  4. Init_USART1(115200);//从控制器状态信息及上位机控制
  5. Init_USART3(115200);//备用
  6. Init_TIM1();//串口解析用
  7. Init_Delay();
  8. Init_IO();
  9. Adc_Init();
复制代码

主控制器监控:
采用定时对比LED工作状态(灭、3Hz闪烁、常亮)与AD值,若出现问题,则断开主控电源以及与LED的连接。
在调试过程中,一开始只判断一次,经常会出现主控状态判断异常,经排查,是因为在切换控制状态时,采样时间重叠导致错误。
更改为两次判断对比,问题排除。
  1. /********************************************************************************************
  2. *函数名称:TIM3_Init(void)
  3. *入口参数:void
  4. *出口参数:
  5. *功能说明:主控制器监控
  6. *******************************************************************************************/
  7. void Init_TIM3(u16 arr,u16 psc)
  8. {
  9.     TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
  10.     NVIC_InitTypeDef        NVIC_InitStructure;

  11.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  12.     TIM_TimeBaseStructure.TIM_Period = arr;
  13.     TIM_TimeBaseStructure.TIM_Prescaler =psc;
  14.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  15.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  16.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  17.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

  18.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  19.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  20.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  21.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22.     NVIC_Init(&NVIC_InitStructure);

  23.     TIM_Cmd(TIM3, ENABLE);
  24. }

复制代码

定时器3中断服务函数

  1. /********************************************************************************************
  2. *函数名称:TIM3_IRQHandler(void)
  3. *入口参数:void
  4. *出口参数:
  5. *功能说明:定时器3中断服务函数
  6. *******************************************************************************************/
  7. void TIM3_IRQHandler(void)
  8. {
  9. if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
  10. {
  11. TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  12. if(Led_Count<3)
  13. {
  14. Led_Status[Led_Count]=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
  15. Led_Count++;
  16. }
  17. else
  18. {
  19. if((Led_Status[0]==1)&&(Led_Status[1]==1)&&(Led_Status[2]==1))
  20. {
  21. if(Adc_Val<1365)
  22. {
  23. Status1=1;
  24. }
  25. else
  26. {
  27. Status1=2;
  28. }
  29. }
  30. else if((Led_Status[0]==0)&&(Led_Status[1]==0)&&(Led_Status[2]==0))
  31. {
  32. if(Adc_Val>=2730)
  33. {
  34. Status1=1;
  35. }
  36. else
  37. {
  38. Status1=2;
  39. }
  40. }
  41. else
  42. {
  43. if((Adc_Val<2730)&&(Adc_Val>=1365))
  44. {
  45. Status1=1;
  46. }
  47. else
  48. {
  49. Status1=2;
  50. }
  51. }
  52. if(Status1==Status2)
  53. {
  54. Work_Status=Status1;
  55. }
  56. Status2=Status1;
  57. Led_Status[0]=0;
  58. Led_Status[1]=0;
  59. Led_Status[2]=0;
  60. Led_Count=0;
  61. }
  62. }
  63. }
复制代码


使用特权

评论回复
 楼主 | 2019-6-8 12:38 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-8 12:43 编辑

串口信息打印及上位机控制:
目前仅增加远程重启从控制器:
命令(帧头 长度 地址 命令字 校验和 帧尾):7B 06 00 FF 05 7D

  1. /********************************************************************************************
  2. *函数名称:USART1_IRQHandler(void)
  3. *入口参数:
  4. *出口参数:
  5. *功能说明:串口1中断服务程序
  6. *******************************************************************************************/
  7. void USART1_IRQHandler(void)
  8. {
  9. USART1->SR = 0x3df;
  10. SerialBuf[SerialIndex] = USART1->DR;
  11. SerialIndex++;
  12. SerialIndex &= 0x3fu;
  13. TIM1->CNT = 1;
  14. TIM1->SR = 0;
  15. TIM1->CR1 = 0x0d;
  16. }
  17. /********************************************************************************************
  18. *函数名称:Init_TIM1(void)
  19. *入口参数:void
  20. *出口参数:
  21. *功能说明:定时器1初始化
  22. *******************************************************************************************/
  23. void Init_TIM1(void)
  24. {
  25.         TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  26.         NVIC_InitTypeDef          NVIC_InitStructure;
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  28.         
  29.         TIM_TimeBaseStructure.TIM_Period = 9999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  30.         TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置用来作为TIMx时钟频率除数的预分频值
  31.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  32.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  33.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  34.         TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  35.         NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM3中断
  36.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
  37.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  38.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  39.         NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
  40.         TIM_Cmd(TIM1, DISABLE);  //使能TIMx
  41. }
  42. /********************************************************************************************
  43. *函数名称:void TIM1_UP_IRQHandler(void)
  44. *入口参数:
  45. *出口参数:
  46. *功能说明:中断服务函数
  47. ********************************************************************************************/
  48. void TIM1_UP_IRQHandler(void)
  49. {
  50. //        printf("ScanMessage\r\n");
  51.         TIM1->SR = 0;
  52.         TIM1->CR1 = 0;
  53.         GetMessage();
  54.         Message_Post(Message[0], Message + 1, MessageLength - 1);
  55.         SerialBuf[0] = 0;
  56.         SerialIndex = 0;
  57. }
  58. /********************************************************************************************
  59. *函数名称:void ScanMessage(void)
  60. *入口参数:
  61. *出口参数:
  62. *功能说明:串口消息解析
  63. ********************************************************************************************/
  64. void ScanMessage(void)
  65. {
  66. //        printf("Cmd=%d\r\n",Msg.Cmd);
  67.         switch(Msg.Cmd)
  68.         {
  69.                 case 0xFF://重启MCU
  70.                         McuRestart();
  71.                         Msg.Cmd = 0;
  72.                         break;               
  73.                 default:
  74.                         break;
  75.         }
  76. }
  77. /********************************************************************************************
  78. *函数名称:void McuRestart(void)
  79. *入口参数:
  80. *出口参数:
  81. *功能说明:MCU复位
  82. ********************************************************************************************/
  83. void McuRestart(void)
  84. {
  85.         printf("McuRestart\r\n");
  86.         
  87.         __set_FAULTMASK(1);
  88.         NVIC_SystemReset();
  89. }
复制代码
从控制器工作截图:
551.jpg

至此从控制器基本完成,下一步进行两控制器联调。

使用特权

评论回复
 楼主 | 2019-6-8 20:50 | 显示全部楼层
做完基本功能以后,要不要对接一下阿里云呢?

使用特权

评论回复
 楼主 | 2019-6-9 18:29 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-10 20:40 编辑

③主从控制器联调。联调过程基本按预期进行,中间出过小插曲,结果是因为接错线导致。。。。。。

主控制器视频:
https://v.youku.com/v_show/id_XNDIyMTQzMTUyOA==.html?spm=a2h3j.8428770.3416059.1
从控制器视频:
https://v.youku.com/v_show/id_XNDIyMTQzMTU0NA==.html?spm=a2h3j.8428770.3416059.1

视频主要展示以下功能:主控制器:
1、ADC采样与LED控制。
2、LCD显示AD值及所处档位。
3、LCD显示LED当前状态。
从控制器:
1、主控制器异常时,从控制器1秒内断开主控电源,并接管控制。
2、串口上传当前AD值、LED状态及主控制器当前状态(正常/异常)。
3、通过命令重启从控制器,此时主控上电,五秒后检测主控工作是否正常。

在看加分项目时发现,程序未按照要求3做(

通过外部调试器或者按键输入使得主控制器能完成控制功能, 但与预先设定的不一样


),待修改。


使用特权

评论回复
 楼主 | 2019-6-10 12:58 | 显示全部楼层
准备开始对接阿里云,因第一次接触阿里云,需要一边学习一边进行

使用特权

评论回复
| 2019-6-10 13:04 | 显示全部楼层
不错哦

使用特权

评论回复
 楼主 | 2019-6-11 10:23 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-11 12:02 编辑

阿里云官方资料:

IOT 学习路径图
https://help.aliyun.com/learn/learningpath/iot.html?source=5176.11533457&userCode=untns54e&type=copy

创建产品与设备_快速入门_阿里云物联网平台-阿里云
https://help.aliyun.com/document_detail/73705.html?source=5176.11533457&userCode=untns54e&type=copy

WiFi模组已准备好,准备开始进行对接~~~



使用特权

评论回复
| 2019-6-12 09:25 | 显示全部楼层
学习下

使用特权

评论回复
 楼主 | 2019-6-12 13:51 | 显示全部楼层
经过三天的学习加实践,对接阿里云基本完成,细节待完善,今天晚上开始分享学习及调试的过程。
Screenshot_20190612_135052_com.aliyun.iot.living.jpg

使用特权

评论回复
 楼主 | 2019-6-12 23:17 | 显示全部楼层
本帖最后由 奋斗小范 于 2019-6-12 23:18 编辑

创建产品与设备
https://help.aliyun.com/document_detail/73705.html?source=5176.11533457&userCode=&type=copy

此次设计中我选用了阿里云的飞燕平台。
1、首先创建项目:
222.png

333.png
此处ID以后对接会用到。
2、点击进入此项目,创建新产品。
444.png
我们的节点是STM32+WIFI模组,选好对应选项。
3、增加标准功能及自定义功能。
此处功能自行定义。
666.png
4、设备调试。
首先需要选好使用的WiFi模组。
777.png

选好之后,新增一个测试设备
888.png
激活凭证在后面会用到(三元组)。增加完成后停在此步,先去搞STM32部分。

使用特权

评论回复
| 2019-6-13 16:38 | 显示全部楼层
奋斗小范 发表于 2019-6-9 18:29
③主从控制器联调。联调过程基本按预期进行,中间出过小插曲,结果是因为接错线导致。。。。。。

主控制器 ...

对主控制器的监控,电路上是怎么做的,如何判断主控制器的异常呢

使用特权

评论回复
 楼主 | 2019-6-13 17:45 | 显示全部楼层
lihui567 发表于 2019-6-13 16:38
对主控制器的监控,电路上是怎么做的,如何判断主控制器的异常呢

{E7666EE8-43D1-451F-9761-C64DF01E8E9E}_20190613171952.jpg
使用了最简单的办法,从控制器直接检测LED控制脚电平,当电平变化时记录边沿时间计算出频率,将电位器的AD值与LED电平对应,若对应关系不成立,则主控异常。
当然,想要更加严谨,还是需要从外部检测灯的状态,像传感器这种非接触方式。

使用特权

评论回复

评论

奋斗小范 2019-6-14 22:25 回复TA
@zhanzr21 :哈哈,这点误差大部分项目都能接受。 
zhanzr21 2019-6-14 21:58 回复TA
@奋斗小范 :DWT-CYCCNT用这个没有专门定时器精确, 读取这个寄存器的时候有时钟周期的消耗, 还有中断嵌套的因素, 除非做补偿, 不过大多数项目不在乎这个误差. 
奋斗小范 2019-6-14 17:32 回复TA
@lihui567 :中断触发时记录边沿状态(上升/下降沿),同时记录当前DWT->CYCCNT 
奋斗小范 2019-6-14 17:30 回复TA
@lihui567 :习惯使用DWT->CYCCNT,精确且不占定时器。 
lihui567 2019-6-14 14:26 回复TA
通过捕获的方法计算频率,也可以通过测量AD值的方法 
 楼主 | 2019-6-14 13:49 | 显示全部楼层
不同模组SDK移植方法:


MCU+支持TCP的模组_MCU上集成SDK_移植指南_C SDK_设备接入Link Kit SDK-阿里云
https://help.aliyun.com/document_detail/97921.html?source=5176.11533457&userCode=untns54e&type=copy



MCU+支持MQTT的模组_MCU上集成SDK_移植指南_C SDK_设备接入Link Kit SDK-阿里云
https://help.aliyun.com/document_detail/97922.html?source=5176.11533457&userCode=untns54e&type=copy


使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

在线客服 快速回复 返回顶部 返回列表