潇潇熊
潇潇熊
这家伙很懒,什么也没写!

注册于 5年前

回答
21
文章
0
关注者
0

发布于1年前

437芯片也有同样问题

发布于2年前

screenshot_图片.png
SDK管理里面添加PyODC
然后在调试这里添加路径就行了

screenshot_图片.png

发布于2年前

这种情况没有绝对会不会丢中断,主要看你的中断频率和你中断函数执行时间以及线程切换程序逻辑,可以先写出代码长时间测试。

发布于2年前

使用ps指令可以看到所有正在运行的线程

发布于2年前

screenshot_图片.png
使用telnet组件就可以啊
添加agile_console和agile_telnet组件

发布于2年前

RT studio编译器里面可以使用DAP link调试AT32的芯片

发布于2年前

找一块带网口的开发板,添加LWIP网络组件,然后用TCP或者UDP都可以传输数据

发布于2年前

screenshot_图片.png

发布于2年前

定时器同时捕获4个通道的PWM代码

  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-09-16 Administrator the first version
  9. */
  10. #include <rtthread.h>
  11. #include <board.h>
  12. #include <drivers/pin.h>
  13. TIM_HandleTypeDef htim8;
  14. #define POWER1_CTRL GET_PIN(H,2)
  15. /**
  16. * @brief TIM8 Initialization Function
  17. * @param None
  18. * @retval None
  19. */
  20. static void MX_TIM8_Init(void)
  21. {
  22. /* USER CODE BEGIN TIM8_Init 0 */
  23. /* USER CODE END TIM8_Init 0 */
  24. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  25. TIM_MasterConfigTypeDef sMasterConfig = {0};
  26. TIM_IC_InitTypeDef sConfigIC = {0};
  27. /* USER CODE BEGIN TIM8_Init 1 */
  28. /* USER CODE END TIM8_Init 1 */
  29. htim8.Instance = TIM8;
  30. htim8.Init.Prescaler = 180-1;
  31. htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
  32. htim8.Init.Period = 65535;
  33. htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  34. htim8.Init.RepetitionCounter = 0;
  35. htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  36. if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
  37. {
  38. Error_Handler();
  39. }
  40. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  41. if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK)
  42. {
  43. Error_Handler();
  44. }
  45. if (HAL_TIM_IC_Init(&htim8) != HAL_OK)
  46. {
  47. Error_Handler();
  48. }
  49. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  50. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  51. if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
  52. {
  53. Error_Handler();
  54. }
  55. sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  56. sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  57. sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  58. sConfigIC.ICFilter = 0;
  59. if (HAL_TIM_IC_ConfigChannel(&htim8, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  60. {
  61. Error_Handler();
  62. }
  63. if (HAL_TIM_IC_ConfigChannel(&htim8, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
  64. {
  65. Error_Handler();
  66. }
  67. if (HAL_TIM_IC_ConfigChannel(&htim8, &sConfigIC, TIM_CHANNEL_3) != HAL_OK)
  68. {
  69. Error_Handler();
  70. }
  71. if (HAL_TIM_IC_ConfigChannel(&htim8, &sConfigIC, TIM_CHANNEL_4) != HAL_OK)
  72. {
  73. Error_Handler();
  74. }
  75. __HAL_TIM_DISABLE(&htim8); //关闭定时器8
  76. __HAL_TIM_SET_COUNTER(&htim8,0);
  77. HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_1); //开启TIM8的捕获通道1,并且开启捕获中断
  78. HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_2); //开启TIM8的捕获通道2,并且开启捕获中断
  79. HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_3); //开启TIM8的捕获通道3,并且开启捕获中断
  80. HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_4); //开启TIM8的捕获通道4,并且开启捕获中断
  81. __HAL_TIM_ENABLE_IT(&htim8,TIM_IT_UPDATE); //使能更新中断
  82. __HAL_TIM_ENABLE(&htim8);//使能定时器8
  83. }
  84. /**
  85. * @brief TIM_Base MSP Initialization
  86. * This function configures the hardware resources used in this example
  87. * @param htim_base: TIM_Base handle pointer
  88. * @retval None
  89. */
  90. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
  91. {
  92. GPIO_InitTypeDef GPIO_InitStruct = {0};
  93. if(htim_base->Instance==TIM8)
  94. {
  95. /* USER CODE BEGIN TIM8_MspInit 0 */
  96. /* USER CODE END TIM8_MspInit 0 */
  97. /* Peripheral clock enable */
  98. __HAL_RCC_TIM8_CLK_ENABLE();
  99. __HAL_RCC_GPIOI_CLK_ENABLE();
  100. /**TIM8 GPIO Configuration
  101. PI7 ------> TIM8_CH3
  102. PI6 ------> TIM8_CH2
  103. PI5 ------> TIM8_CH1
  104. PI2 ------> TIM8_CH4
  105. */
  106. GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_2;
  107. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  108. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  109. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  110. GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
  111. HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
  112. /* TIM8 interrupt Init */
  113. //HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0);
  114. //HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
  115. HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
  116. HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
  117. //HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 0, 0);
  118. //HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
  119. HAL_NVIC_SetPriority(TIM8_CC_IRQn, 0, 0);
  120. HAL_NVIC_EnableIRQ(TIM8_CC_IRQn);
  121. /* USER CODE BEGIN TIM8_MspInit 1 */
  122. /* USER CODE END TIM8_MspInit 1 */
  123. }
  124. }
  125. /**
  126. * @brief TIM_Base MSP De-Initialization
  127. * This function freeze the hardware resources used in this example
  128. * @param htim_base: TIM_Base handle pointer
  129. * @retval None
  130. */
  131. void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
  132. {
  133. if(htim_base->Instance==TIM8)
  134. {
  135. /* USER CODE BEGIN TIM8_MspDeInit 0 */
  136. /* USER CODE END TIM8_MspDeInit 0 */
  137. /* Peripheral clock disable */
  138. __HAL_RCC_TIM8_CLK_DISABLE();
  139. /**TIM8 GPIO Configuration
  140. PI7 ------> TIM8_CH3
  141. PI6 ------> TIM8_CH2
  142. PI5 ------> TIM8_CH1
  143. PI2 ------> TIM8_CH4
  144. */
  145. HAL_GPIO_DeInit(GPIOI, GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_2);
  146. /* TIM8 interrupt DeInit */
  147. //HAL_NVIC_DisableIRQ(TIM8_BRK_TIM12_IRQn);
  148. HAL_NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn);
  149. //HAL_NVIC_DisableIRQ(TIM8_TRG_COM_TIM14_IRQn);
  150. HAL_NVIC_DisableIRQ(TIM8_CC_IRQn);
  151. /* USER CODE BEGIN TIM8_MspDeInit 1 */
  152. /* USER CODE END TIM8_MspDeInit 1 */
  153. }
  154. }
  155. void TIM8_UP_TIM13_IRQHandler(void)
  156. {
  157. HAL_TIM_IRQHandler(&htim8);
  158. }
  159. /**
  160. * @brief This function handles TIM8 capture compare interrupt.
  161. */
  162. void TIM8_CC_IRQHandler(void)
  163. {
  164. HAL_TIM_IRQHandler(&htim8);
  165. }
  166. //捕获状态
  167. //[7]:0,没有成功的捕获;1,成功捕获到一次.
  168. //[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
  169. //[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)
  170. rt_uint8_t TIM8CH3_CAPTURE_STA = 0; //输入捕获状态
  171. rt_uint16_t TIM8CH3_CAPTURE_VAL; //输入捕获值(TIM8是16位)
  172. rt_uint16_t tim8ch3_cnt_zero;
  173. rt_uint8_t TIM8CH4_CAPTURE_STA = 0; //输入捕获状态
  174. rt_uint16_t TIM8CH4_CAPTURE_VAL; //输入捕获值(TIM8是16位)
  175. rt_uint16_t tim8ch4_cnt_zero;
  176. rt_uint8_t TIM8CH2_CAPTURE_STA = 0; //输入捕获状态
  177. rt_uint16_t TIM8CH2_CAPTURE_VAL; //输入捕获值(TIM8是16位)
  178. rt_uint16_t tim8ch2_cnt_zero;
  179. rt_uint8_t TIM8CH1_CAPTURE_STA = 0; //输入捕获状态
  180. rt_uint16_t TIM8CH1_CAPTURE_VAL; //输入捕获值(TIM8是16位)
  181. rt_uint16_t tim8ch1_cnt_zero;
  182. //定时器更新中断(计数溢出)中断处理回调函数, 该函数在HAL_TIM_IRQHandler中会被调用
  183. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
  184. {
  185. rt_interrupt_enter();
  186. if((TIM8CH1_CAPTURE_STA & 0X80)==0)//还未成功捕获
  187. {
  188. if(TIM8CH1_CAPTURE_STA & 0X40)//已经捕获到高电平了
  189. {
  190. if((TIM8CH1_CAPTURE_STA & 0X3F) == 0X3F)//高电平太长了
  191. {
  192. TIM8CH1_CAPTURE_STA |= 0X80; //标记成功捕获了一次
  193. TIM8CH1_CAPTURE_VAL = 0XFFFF;
  194. }
  195. else
  196. TIM8CH1_CAPTURE_STA ++;
  197. }
  198. }
  199. if((TIM8CH2_CAPTURE_STA & 0X80)==0)//还未成功捕获
  200. {
  201. if(TIM8CH2_CAPTURE_STA & 0X40)//已经捕获到高电平了
  202. {
  203. if((TIM8CH2_CAPTURE_STA & 0X3F) == 0X3F)//高电平太长了
  204. {
  205. TIM8CH2_CAPTURE_STA |= 0X80; //标记成功捕获了一次
  206. TIM8CH2_CAPTURE_VAL = 0XFFFF;
  207. }
  208. else
  209. TIM8CH2_CAPTURE_STA ++;
  210. }
  211. }
  212. if((TIM8CH3_CAPTURE_STA & 0X80)==0)//还未成功捕获
  213. {
  214. if(TIM8CH3_CAPTURE_STA & 0X40)//已经捕获到高电平了
  215. {
  216. if((TIM8CH3_CAPTURE_STA & 0X3F) == 0X3F)//高电平太长了
  217. {
  218. TIM8CH3_CAPTURE_STA |= 0X80; //标记成功捕获了一次
  219. TIM8CH3_CAPTURE_VAL = 0XFFFF;
  220. }
  221. else
  222. TIM8CH3_CAPTURE_STA ++;
  223. }
  224. }
  225. if((TIM8CH4_CAPTURE_STA & 0X80)==0)//还未成功捕获
  226. {
  227. if(TIM8CH4_CAPTURE_STA & 0X40)//已经捕获到高电平了
  228. {
  229. if((TIM8CH4_CAPTURE_STA & 0X3F) == 0X3F)//高电平太长了
  230. {
  231. TIM8CH4_CAPTURE_STA |= 0X80; //标记成功捕获了一次
  232. TIM8CH4_CAPTURE_VAL = 0XFFFF;
  233. }
  234. else
  235. TIM8CH4_CAPTURE_STA ++;
  236. }
  237. }
  238. rt_interrupt_leave();
  239. }
  240. //定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
  241. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
  242. {
  243. rt_interrupt_enter();
  244. if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//捕获1发生捕获事件
  245. {
  246. if((TIM8CH1_CAPTURE_STA & 0X80) == 0)//还未成功捕获
  247. {
  248. if(TIM8CH1_CAPTURE_STA & 0X40) //捕获到一个下降沿
  249. {
  250. TIM8CH1_CAPTURE_STA |= 0X80; //标记成功捕获到一次高电平脉宽
  251. TIM8CH1_CAPTURE_VAL = TIM8->CCR1;
  252. TIM8->CCER &= ~(1<<1);//配置TIM8通道2上升沿捕获
  253. }
  254. else //还未开始,第一次捕获上升沿
  255. {
  256. tim8ch1_cnt_zero = TIM8->CCR1;
  257. TIM8CH1_CAPTURE_STA = 0;
  258. TIM8CH1_CAPTURE_VAL = 0;
  259. TIM8CH1_CAPTURE_STA |= 0X40; //标记捕获到了上升沿
  260. TIM8->CCER |= 1<<1;//定时器8通道2设置为下降沿捕获
  261. }
  262. }
  263. }
  264. if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)//捕获2发生捕获事件
  265. {
  266. if((TIM8CH2_CAPTURE_STA & 0X80) == 0)//还未成功捕获
  267. {
  268. if(TIM8CH2_CAPTURE_STA & 0X40) //捕获到一个下降沿
  269. {
  270. TIM8CH2_CAPTURE_STA |= 0X80; //标记成功捕获到一次高电平脉宽
  271. TIM8CH2_CAPTURE_VAL = TIM8->CCR2;
  272. TIM8->CCER &= ~(1<<5);//配置TIM8通道2上升沿捕获
  273. }
  274. else //还未开始,第一次捕获上升沿
  275. {
  276. tim8ch2_cnt_zero = TIM8->CCR2;
  277. TIM8CH2_CAPTURE_STA = 0;
  278. TIM8CH2_CAPTURE_VAL = 0;
  279. TIM8CH2_CAPTURE_STA |= 0X40; //标记捕获到了上升沿
  280. TIM8->CCER |= 1<<5;//定时器8通道2设置为下降沿捕获
  281. }
  282. }
  283. }
  284. if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)//捕获3发生捕获事件
  285. {
  286. if((TIM8CH3_CAPTURE_STA & 0X80) == 0)//还未成功捕获
  287. {
  288. if(TIM8CH3_CAPTURE_STA & 0X40) //捕获到一个下降沿
  289. {
  290. TIM8CH3_CAPTURE_STA |= 0X80; //标记成功捕获到一次高电平脉宽
  291. TIM8CH3_CAPTURE_VAL = TIM8->CCR3;
  292. TIM8->CCER &= ~(1<<9);//配置TIM8通道3上升沿捕获
  293. }
  294. else //还未开始,第一次捕获上升沿
  295. {
  296. tim8ch3_cnt_zero = TIM8->CCR3;
  297. TIM8CH3_CAPTURE_STA = 0;
  298. TIM8CH3_CAPTURE_VAL = 0;
  299. TIM8CH3_CAPTURE_STA |= 0X40; //标记捕获到了上升沿
  300. TIM8->CCER |= 1<<9;//定时器8通道3设置为下降沿捕获
  301. }
  302. }
  303. }
  304. if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)//捕获4发生捕获事件
  305. {
  306. if((TIM8CH4_CAPTURE_STA & 0X80) == 0)//还未成功捕获
  307. {
  308. if(TIM8CH4_CAPTURE_STA & 0X40) //捕获到一个下降沿
  309. {
  310. TIM8CH4_CAPTURE_STA |= 0X80; //标记成功捕获到一次高电平脉宽
  311. TIM8CH4_CAPTURE_VAL = TIM8->CCR4;
  312. TIM8->CCER &= ~(1<<13);//配置TIM8通道3上升沿捕获
  313. }
  314. else //还未开始,第一次捕获上升沿
  315. {
  316. tim8ch4_cnt_zero = TIM8->CCR4;
  317. TIM8CH4_CAPTURE_STA = 0;
  318. TIM8CH4_CAPTURE_VAL = 0;
  319. TIM8CH4_CAPTURE_STA |= 0X40; //标记捕获到了上升沿
  320. TIM8->CCER |= 1<<13;//定时器8通道3设置为下降沿捕获
  321. }
  322. }
  323. }
  324. rt_interrupt_leave();
  325. }
  326. extern float robot_aims_speed;
  327. extern rt_uint8_t mknm4_fx;
  328. void forword_check_speed(rt_uint16_t spedd)
  329. {
  330. float sed_spd_f = 0;
  331. if(spedd > 550)
  332. {
  333. mknm4_fx = 0x09;
  334. sed_spd_f = (float)spedd;
  335. sed_spd_f = sed_spd_f - 550;
  336. robot_aims_speed = sed_spd_f * 0.001;
  337. }
  338. else if(spedd < 450)
  339. {
  340. mknm4_fx = 0x06;
  341. sed_spd_f = (float)spedd;
  342. sed_spd_f = 450 - sed_spd_f;
  343. robot_aims_speed = sed_spd_f * 0.001;
  344. }
  345. else
  346. {
  347. mknm4_fx = 0x00;
  348. robot_aims_speed = 0.0;
  349. }
  350. }
  351. void leftright_check_speed(rt_uint16_t lrdata)
  352. {
  353. float sed_spd_f = 0;
  354. if(lrdata > 550)
  355. {
  356. mknm4_fx = 0x0F;
  357. sed_spd_f = (float)lrdata;
  358. sed_spd_f = sed_spd_f - 550;
  359. robot_aims_speed = sed_spd_f * 0.001;
  360. }
  361. else if(lrdata < 450)
  362. {
  363. mknm4_fx = 0x00;
  364. sed_spd_f = (float)lrdata;
  365. sed_spd_f = 450 - sed_spd_f;
  366. robot_aims_speed = sed_spd_f * 0.001;
  367. }
  368. else
  369. {
  370. mknm4_fx = 0x00;
  371. robot_aims_speed = 0.0;
  372. }
  373. }
  374. void zhuanxiang_check_speed(rt_uint16_t lrdata)
  375. {
  376. float sed_spd_f = 0;
  377. if(lrdata > 550)
  378. {
  379. mknm4_fx = 0x00;
  380. sed_spd_f = (float)lrdata;
  381. sed_spd_f = sed_spd_f - 550;
  382. robot_aims_speed = sed_spd_f * 0.0005;
  383. }
  384. else if(lrdata < 450)
  385. {
  386. mknm4_fx = 0x0f;
  387. sed_spd_f = (float)lrdata;
  388. sed_spd_f = 450 - sed_spd_f;
  389. robot_aims_speed = sed_spd_f * 0.0005;
  390. }
  391. else
  392. {
  393. mknm4_fx = 0x00;
  394. robot_aims_speed = 0.0;
  395. }
  396. }
  397. void forback_leftright(rt_uint16_t fbdata,rt_uint16_t lrdata)
  398. {
  399. float sed_spd_f = 0;
  400. if(fbdata > 550)
  401. {
  402. if(lrdata > 550)
  403. {
  404. mknm4_fx = 0x52;
  405. sed_spd_f = (float)lrdata;
  406. sed_spd_f = sed_spd_f - 550;
  407. robot_aims_speed = sed_spd_f * 0.0005;
  408. rt_kprintf("1\n");
  409. }
  410. else if(lrdata < 450)
  411. {
  412. mknm4_fx = 0x58;
  413. sed_spd_f = (float)lrdata;
  414. sed_spd_f = 450 - sed_spd_f;
  415. robot_aims_speed = sed_spd_f * 0.0005;
  416. rt_kprintf("2\n");
  417. }
  418. }
  419. else if(fbdata < 450)
  420. {
  421. if(lrdata > 550)
  422. {
  423. mknm4_fx = 0xa1;
  424. sed_spd_f = (float)lrdata;
  425. sed_spd_f = sed_spd_f - 550;
  426. robot_aims_speed = sed_spd_f * 0.0005;
  427. rt_kprintf("3 = %d\n",lrdata);
  428. }
  429. else if(lrdata < 450)
  430. {
  431. mknm4_fx = 0xa4;
  432. sed_spd_f = (float)lrdata;
  433. sed_spd_f = 450 - sed_spd_f;
  434. robot_aims_speed = sed_spd_f * 0.0005;
  435. //rt_kprintf("4 = %d\n",lrdata);
  436. }
  437. }
  438. else
  439. {
  440. mknm4_fx = 0x00;
  441. robot_aims_speed = 0.0;
  442. }
  443. }
  444. extern rt_uint8_t mknm4_lock_flag;
  445. rt_uint32_t extern_tmp_ch3 = 0;
  446. #define CSB_PRIORITY 15//任务优先级
  447. static char csb_stack[800];
  448. static struct rt_thread csb_thread;
  449. static void csb_entry(void *parameter)
  450. {
  451. rt_uint8_t print_ct = 0;
  452. rt_uint32_t tmp_ch4 = 0;
  453. rt_uint32_t tmp_ch3 = 0;
  454. rt_uint32_t tmp_ch2 = 0;
  455. rt_uint32_t tmp_ch1 = 0;
  456. rt_thread_mdelay(2000);
  457. MX_TIM8_Init();
  458. rt_pin_mode(POWER1_CTRL, PIN_MODE_OUTPUT);
  459. rt_pin_write(POWER1_CTRL, PIN_HIGH);
  460. while(1)
  461. {
  462. rt_thread_mdelay(10);
  463. if(TIM8CH1_CAPTURE_STA & 0X80) //成功捕获到了一次高电平
  464. {
  465. if((TIM8CH1_CAPTURE_STA & 0X3F) == 0)//还没有溢出过
  466. tmp_ch1 = TIM8CH1_CAPTURE_VAL - tim8ch1_cnt_zero;
  467. else
  468. tmp_ch1 = (0XFFFF - tim8ch1_cnt_zero) + TIM8CH1_CAPTURE_VAL;
  469. if(tmp_ch1 > 2000)//油门通道
  470. {
  471. tmp_ch1 = 2000;
  472. }
  473. else if(tmp_ch1 < 1000)
  474. {
  475. tmp_ch1 = 1000;
  476. }
  477. tmp_ch1 = tmp_ch1 - 1000;
  478. if(tmp_ch1 < 100)
  479. tmp_ch1 = 0;
  480. TIM8CH1_CAPTURE_STA = 0;
  481. }
  482. if(TIM8CH2_CAPTURE_STA & 0X80) //成功捕获到了一次高电平
  483. {
  484. if((TIM8CH2_CAPTURE_STA & 0X3F) == 0)//还没有溢出过
  485. tmp_ch2 = TIM8CH2_CAPTURE_VAL - tim8ch2_cnt_zero;
  486. else
  487. tmp_ch2 = (0XFFFF - tim8ch2_cnt_zero) + TIM8CH2_CAPTURE_VAL;
  488. if(tmp_ch2 > 2000)//油门通道
  489. {
  490. tmp_ch2 = 2000;
  491. }
  492. else if(tmp_ch2 < 1000)
  493. {
  494. tmp_ch2 = 1000;
  495. }
  496. tmp_ch2 = tmp_ch2 - 1000;
  497. if(tmp_ch2 < 100)
  498. tmp_ch2 = 0;
  499. TIM8CH2_CAPTURE_STA = 0;
  500. }
  501. if(TIM8CH3_CAPTURE_STA & 0X80) //成功捕获到了一次高电平
  502. {
  503. if((TIM8CH3_CAPTURE_STA & 0X3F) == 0)//还没有溢出过
  504. tmp_ch3 = TIM8CH3_CAPTURE_VAL - tim8ch3_cnt_zero;
  505. else
  506. tmp_ch3 = (0XFFFF - tim8ch3_cnt_zero) + TIM8CH3_CAPTURE_VAL;
  507. if(tmp_ch3 > 2000)//左右通道
  508. {
  509. tmp_ch3 = 2000;
  510. }
  511. else if(tmp_ch3 < 1000)
  512. {
  513. tmp_ch3 = 1000;
  514. }
  515. tmp_ch3 = tmp_ch3 - 1000;
  516. TIM8CH3_CAPTURE_STA = 0;
  517. }
  518. if(TIM8CH4_CAPTURE_STA & 0X80) //成功捕获到了一次高电平
  519. {
  520. if((TIM8CH4_CAPTURE_STA & 0X3F) == 0)//还没有溢出过
  521. tmp_ch4 = TIM8CH4_CAPTURE_VAL - tim8ch4_cnt_zero;
  522. else
  523. tmp_ch4 = (0XFFFF - tim8ch4_cnt_zero) + TIM8CH4_CAPTURE_VAL;
  524. if(tmp_ch4 > 2000)//前后通道
  525. {
  526. tmp_ch4 = 2000;
  527. }
  528. else if(tmp_ch4 < 1000)
  529. {
  530. tmp_ch4 = 1000;
  531. }
  532. tmp_ch4 = tmp_ch4 - 1000;
  533. TIM8CH4_CAPTURE_STA = 0;
  534. }
  535. //右手、前ch3-->1000,后ch3-->0,前后走
  536. if(((tmp_ch3 < 450) || (tmp_ch3 > 550)) && ((tmp_ch2 < 450) || (tmp_ch2 > 550)))
  537. {
  538. //forback_leftright(tmp_ch2,tmp_ch3);
  539. mknm4_lock_flag = 0;
  540. }
  541. else if((tmp_ch3 < 450) || (tmp_ch3 > 550))
  542. {
  543. //forword_check_speed(tmp_ch3);
  544. mknm4_lock_flag = 0;
  545. }
  546. /*
  547. if(tmp_ch3 < 100)
  548. {
  549. mknm4_lock_flag = 0;
  550. mknm4_fx = 0x0F;
  551. robot_aims_speed = 0.2;
  552. }
  553. */
  554. if((tmp_ch3 < 200))
  555. {
  556. //右手、左ch1-->1000,右ch1-->0,横走
  557. if((tmp_ch1 < 450) || (tmp_ch1 > 550))
  558. {
  559. leftright_check_speed(tmp_ch1);
  560. mknm4_lock_flag = 0;
  561. }
  562. else
  563. {
  564. mknm4_lock_flag = 1;
  565. mknm4_fx = 0x00;
  566. robot_aims_speed = 0.0;
  567. }
  568. }
  569. else
  570. {
  571. mknm4_lock_flag = 1;
  572. mknm4_fx = 0x00;
  573. robot_aims_speed = 0.0;
  574. }
  575. if(tmp_ch1 == 0 && tmp_ch2 == 0 && tmp_ch3 == 0 && tmp_ch4 == 0)
  576. {
  577. mknm4_lock_flag = 1;
  578. mknm4_fx = 0x00;
  579. robot_aims_speed = 0.0;
  580. }
  581. print_ct ++;
  582. if(print_ct > 100)
  583. {
  584. print_ct = 0;
  585. rt_kprintf("CH1 = %d,CH2 = %d,CH3 = %d,CH5 = %d\n",tmp_ch1,tmp_ch2,tmp_ch3,tmp_ch4);
  586. }
  587. extern_tmp_ch3 = tmp_ch3;
  588. }
  589. }
  590. static int csb_sample(void)
  591. {
  592. rt_thread_init(&csb_thread,
  593. "csbsample",
  594. csb_entry,
  595. RT_NULL,
  596. &csb_stack[0],
  597. sizeof(csb_stack),
  598. CSB_PRIORITY,100);
  599. rt_thread_startup(&csb_thread);
  600. return 0;
  601. }
  602. INIT_APP_EXPORT(csb_sample);

发布于3年前

这个问题官方还没解决吗,同样的程序用st-link下载可以运行,用DAP-link下载连BootLoader都不运行了。感觉是BootLoader被覆盖掉了。

发布于4年前

楼主解决了吗,我也遇到同样的问题,can发送很多次后会阻塞在size = rt_device_write(can_dev, 0, &msg1, sizeof(msg1));这里,无法向下执行了。
也不是每次都出现,有时候运行上一个多小时才会出现这个问题,不知道rt_device_write是否可以设置超时时间。

发布于4年前

发布于4年前

发布于4年前

我也遇到同样问题,参考这里的解决办法
https://blog.csdn.net/qq_25186745/article/details/112858439

发布于4年前

回到
顶部

发布
问题

投诉
建议