[N32L4xx] N32L406的无外部晶体USB问题

[复制链接]
1389|3
 楼主| 技术工程师 发表于 2023-8-22 09:50 | 显示全部楼层 |阅读模式
再开发USBMCS设备的时候,测试出一个问题,在使用N32L406的无外部晶体模式的时候,如果MCU进入STOP2模式,那么退出休眠再次同电脑进行通讯的话,MSC在此电脑上面的表现可能只有一个U盘,根本无法点进去,这个地方可能是由于使用了UCDR模块导致的,而且UCDR模块也无法关闭,请问一下有没有解决方案。
贴代码
这个是进入休眠的代码,进入STOP2要旁路UCDR,不然休眠好像会卡住,然后用了一个脚做了检测USB拔插的脚退出休眠的时候检测是否上电,上电的话就会延时1s,稳定USB时钟 企业微信截图_16926688141184.png
这边是USB的初始化过程,这个DP的上下拉是参考了PC的通讯流程,要复位USB,得下拉DP10ms,如果这里不下拉,那么USB无法正常初始化 企业微信截图_16926688527408.png
zyf部长 发表于 2023-8-27 12:00 | 显示全部楼层
可能只有一个U盘还是确定只有?
 楼主| 技术工程师 发表于 2023-8-28 09:53 | 显示全部楼层
zyf部长 发表于 2023-8-27 12:00
可能只有一个U盘还是确定只有?

这个问题已经解决了,用HSI-PLL供一个48M给USB,就解决了,是由UCDR休眠重启导致时钟不准确导致的
 楼主| 技术工程师 发表于 2023-8-28 09:55 | 显示全部楼层
  1. void Adj_HSI_Value(void)
  2. {
  3.     int32_t hsi_opt;
  4.     int32_t hsi_trim;
  5.     int8_t hsi_opt_temp;
  6.     int8_t hsi_trim_temp;
  7.           int8_t temp;
  8.           uint32_t time_out = 0xFFFFF;

  9.                 RCC_ConfigLse(RCC_LSE_ENABLE,0x28);
  10.                 while (RCC_GetFlagStatus(RCC_LDCTRL_FLAG_LSERD) == RESET)
  11.                 {
  12.                 }
  13.           /* Enable Clock Security System(CSS): this will generate an NMI exception
  14.        when HSE clock fails */       
  15.     TIM9_ConfigForLSE();

  16.                 RCC_EnableClockSecuritySystem(ENABLE);
  17.        
  18. #if   0          //使用 PA8调试查看波形
  19.                 /*调试时先用该函数把频率调偏,然后用下面的函数自动调回来*/
  20.                 AFEC_ConfigHSITrim(AFEC_HSI_OPT_NUM5,AFEC_HSI_TRIM_NUM0);
  21.     /* Output HSE clock on MCO pin
  22.     * ---------------------------------------------*/
  23.     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
  24.     GPIO_InitType GPIO_InitStructure;
  25.     GPIO_InitStruct(&GPIO_InitStructure);
  26.     GPIO_InitStructure.Pin             = GPIO_PIN_8;
  27.     GPIO_InitStructure.GPIO_Mode       = GPIO_Mode_AF_PP;
  28.     GPIO_InitStructure.GPIO_Alternate  = GPIO_AF8_MCO;
  29.     GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

  30.     RCC_ConfigMcoClkPre(RCC_MCO_CLK_NUM0);
  31.     RCC_ConfigMco(RCC_MCO_HSI);
  32. #endif  
  33.     //等待中断完成
  34.     while((adj_flag == 0) && (time_out != 0))
  35.                 {
  36.                   time_out--;                //超时
  37.                 }
  38.                 if(time_out != 0)
  39.                 {
  40.                         //afec_hsi_opt[24:21]位粗调 HSI 频率,步长约为 700kHz,afec_hsi_trim[20:16]细调 HSI 频率,步长约为40kHz。
  41.                         //(TIM工作频率 -  计算频率)*2得到 16M主频差值
  42.                         hsi_opt_temp = ((int32_t)16000000 - Capture  / 0.0029296875) / 1000 / 700;
  43.                         hsi_trim_temp = (((int32_t)16000000  - Capture  / 0.0029296875) / 1000 - 700 * hsi_opt_temp) / 40;
  44.                         AFEC_GetHSITrim(&hsi_opt, &hsi_trim);
  45.                        
  46.                        
  47.                         if(hsi_trim_temp > 0)
  48.                         {
  49.                                 hsi_trim += hsi_trim_temp;
  50.                                 if(hsi_trim > 31)  //如果调整增加超过细调范围,增加粗调一次700K
  51.                                 {
  52.                                         temp = hsi_trim / 17;   // 700/40 = 17.5
  53.                                         hsi_opt_temp += temp;
  54.                                         hsi_trim = hsi_trim - 17*temp;
  55.                                 }
  56.                         }
  57.                        
  58.                         if(hsi_trim_temp < 0)
  59.                         {
  60.                                 if(hsi_trim + hsi_trim_temp < 0)  //如果小于0则向粗调借位
  61.                                 {
  62.                                                 temp = hsi_trim_temp / 17;   // 700/40 = 17.5
  63.                                                 hsi_opt_temp += temp;
  64.                                                 hsi_trim_temp = hsi_trim_temp - 17*temp;  //temp为负数
  65.                                        
  66.                                                 if(hsi_trim + hsi_trim_temp < 0)  //如果小于0则向粗调借位
  67.                                                 {
  68.                                                                 temp = - 1;   // 700/40 = 17.5
  69.                                                                 hsi_opt_temp += temp;
  70.                                                                 hsi_trim_temp = hsi_trim_temp - 17*temp;  //temp为负数
  71.                                                 }                                       
  72.                                 }
  73.                                 hsi_trim += hsi_trim_temp;   //最后为正数
  74.                                
  75.                         }
  76.                        
  77.                         hsi_opt += hsi_opt_temp;

  78.                         hsi_opt &= 0xF;
  79.                         hsi_trim &= 0x1F;
  80.                         AFEC_ConfigHSITrim(hsi_opt << 21, hsi_trim << 16);
  81.                 }

  82.     TIM9_Deinit();
  83. }



这个是找的国民官方技术,他们帮忙用外部LSE校准了HSI,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

92

帖子

0

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