組み込みシステム学習ノート


1.(2012.01.31 09:11)昨日STM 32でPCシリアルポートに送信したところ、問題がありました.PC側のソフトウェアは初めてシリアルポートを開いた後、正常に受信した.しかし、シリアルポートを閉じてから開くと、データがエラーになります.2つのシリアルポート受信ソフトを試したが、1つは聂小猛のSSCOM 3である.2、もう一つはSecureCRT 6です.7、結果はすべてそうでした.
STM 32のシリアルポート送信プログラムは以下の通りです.
void Serial_SendChar(char c)
{
  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);
  USART_SendData(USART1, c);
}

次にmain関数のデッドサイクルで呼び出します.
  while (1)
  {
    Serial_SendChar('a');
  }

シリアルポートパラメータ:115200,8,N,1,フロー制御なし.
別のプログラムでセリア_SendCharの呼び出しはそれほど頻繁ではなく、この問題は発見されなかった.
XPシリアルの問題だと疑っています.
2.(2012.03.21)昨日ボードを調整したプログラムでAD採取異常が発見され、一定時間ごとにADのサンプリング値は4095であった.コードを見て、低レベルのエラーが発生したことを発見しました.ADが収集した関数コードは以下の通りです.
u16 stm32_get_adc(u8 ADC_Channel)
{
  //select channel
  ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_239Cycles5);

  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

  return ADC_GetConversionValue(ADC1);
}

複数のタスクが同時にこの関数を呼び出すと、関数の再読み込みが発生する可能性があります.再読み込みすると、前回のADデータに異常が生じることは明らかです.
不思議なことに、この関数は複数のプロジェクトで長い時間を費やしても、このような問題は発生しませんでした.関連コードを見た後、私は初歩的な結論を出した:以前のコードはすべて高優先度の割り込みでこの関数(裸走システム)を呼び出したので、再入の確率は低い;昨日問題が発生したコード、ADデータの異常な任務は1つの低優先度の任務(RTX)で、そのため再入の確率は大きくなります.
反発量を加えた後、コピー機は一晩中ADデータの異常は発生しなかった.この問題から、この間に出てきたもう一つのADデータ異常問題(Keil RL-ARM学習ノート、第18条)を思い出したのも、そのためかもしれない.