FreeRTOSを使用しているstm32L476のRTCで異常な動作をしています。stm32l4 RTC HALが機能しない
実行時に内部レジスタの値をセーブして上がっているため、RUNモードで最初に読み込むだけです.RTCが動作しています。また
私はライン583でstm32l4xx_hal_rtc.cにブレークポイントを置くとき、私はDEBUGを行う場合:
tmpreg = (uint32_t)(hrtc->Instance->TR & RTC_TR_RESERVED_MASK);
*breakpoint* sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
私はtmpregを見ることができますし、私は次のブレークポイント魔女へのジャンプをクリックしたとき、彼らは更新登録方法、およびTR
私はディスプレイが更新されたのを見たのと同じです。
だから、通常のRUNで動作しないのはなぜですか?
初期化コード(MXが生成キューブ):
void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
/**Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initialize RTC and set the Time and Date
*/
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 1;
sDate.Year = 0;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);
}
}
void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{
if(rtcHandle->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspInit 0 */
/* USER CODE END RTC_MspInit 0 */
/* RTC clock enable */
__HAL_RCC_RTC_ENABLE();
/* USER CODE BEGIN RTC_MspInit 1 */
/* USER CODE END RTC_MspInit 1 */
}
}
クロックreaded、すべてこのタスクおよび機能が同じmenu.cにある印刷されたタスク:
void MenuTask(void const *argument){
for(;;){
/*
* Menus
*/
DrawMenu();
osDelay(100);
}
}
void DrawMenu(){
switch(menuTaskStatus){
/* Not important code */
case MENU_INFO:
menuInfoBar();
break;
}
}
私に印刷液晶は、中に時計を持つバー
void menuInfoBar(){
//Clock
CheckClock();
if(updateNeeded.Clock){
DrawClock();
updateNeeded.Clock = 0;
}
}
私はトライを持っていることがわかりますシンクロを待つだけでなく動作しませんでした。私はこのシンクロとRTCの読書がどのように働くのかについて疑問を抱いています。
void CheckClock(){
RTC_TimeTypeDef timeVar;
// HAL_GPIO_TogglePin(LEDR_GPIO_Port, LEDR_Pin);
// if(HAL_RTC_WaitForSynchro(&hrtc) == HAL_OK){
while(HAL_RTC_GetTime(&hrtc,&timeVar,RTC_FORMAT_BIN)!= HAL_OK);
if(timeVar.Seconds != timeVarAnt.Seconds){
timeVarAnt.Minutes = timeVar.Minutes;
timeVarAnt.Hours = timeVar.Hours;
timeVarAnt.Seconds = timeVar.Seconds;
updateNeeded.Clock = 1;
}
// }
}
ここで私は私のディスプレイに
void DrawClock(){
DISP_locate(49,0);
sprintf((char *)stringBuffer,"%02d:%02d:%02d",(int)timeVarAnt.Hours,(int)timeVarAnt.Minutes,(int)timeVarAnt.Seconds);
DISP_puts((char *)stringBuffer);
}
をクロックを描くことは、私は100ミリ秒と高速なRTCを読み取ることができない可能性は? なぜ私はsyncronitzationが必要なのですか?データシートでは、クロックが7倍速い場合は、80MHzのAPB1クロックを使用しています。
いくつかのチュートリアルとサンプル私は正確に同じことを実行しましたが、osDelay多くの値の()。 freeRTOSを使用してタスクを読み込む際に問題がありますか?
時間は、私は5秒遅れで試してみた何の関係もありませんし、また
おかげ
- ちょうどこのHALのブロートウェア? –
私はハードウェアの専門家です。ソフトウェアでできる時間を無駄にしたくありません。しかし、このナンセンスの問題がすべて解決された後、私は、HALライブラリがSTが望む賢明なソリューションではないことを確信しています。 – taquionbcn
周辺機器の知識なしにuCを使用することはできません。 HALを使用しても変更されませんが、不可能です。そして、終わりにはあなたはuCと非常に貧弱なバグ、不具合、そして奇妙なHALライブラリが書かれていることを学ぶ必要があります。だから、あなたは多くの時間を無駄にしています。ベアメタル方法をプログラミングする人々からの質問はほとんどないことに気付きましたか?HAL –