STM32F103のフラッシュにロギングしたデータを保存するプログラムを書いている。
今日嵌ったのが構造体のアライメント、
1Word = 16bitが最低単位のつもりで
struct _DATA{
u32 a;
u16 b,c,d;
};
という構造体を宣言してサイズが10Byteのつもりで
配列を取っていたらFlash領域をはみ出してエラー、
しばらく悩んで構造体のサイズを確認してみたら16Byteになっている。
そうか、32bitCPUのコンパイラはそうなんだ。
と納得。
仕方がないから構造体を使わずにデータを詰めていくことにする。
Oct 22, 2009
Oct 13, 2009
STM32F103のADとDMA機能
その分設定はちょっとややこしいがライブラリの使い方さえ覚えれば簡単、
ADとDMAの設定をするだけで高速の連続取込ができる。
勿論H8などでもDMAは使えるが使い勝手が全然違う
40KHz超音波センサの信号も増幅回路だけでこのように直接ADに
波形がちゃんと取り込める。
この写真は取り込んだデータをテキストで吐き出してグラフ表示させたもの、
今まではコンパレータで閾値を超えたところで
タイマ入力にトリガをかけて時間を計測していたけれど
これなら直接取り込んだデータをソフトで処理できるから色々な可能性が見えてくる。
初期化の部分はこんな感じ。
/*******************************************************************************
* Function Name : ADC1_Config
* Description : DMAを使用、ADCConvertedValue[16] へ連続してAD変換を行う
* 8CH のみ
* Input : None
* Output : None
* Return : None
*******************************************************************************/
static void ADC1_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* System clocks configuration ---------------------------------------------*/
/* Enable peripheral clocks --------------------------------------------------*/
/* Enable DMA1 clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
// 各ポートを有効にする
// ピン割り当て機能を有効にする
/* NVIC configuration ------------------------------------------------------*/
//NVIC_Configuration();
/* Enable DMA1 channel6 IRQ Channel */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* GPIO configuration ------------------------------------------------------*/
/* Configure as analog input -------------------------*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = US_LEFT_PIN; // US-Left, US-Right
GPIO_Init(US_LEFT_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = US_RIGHT_PIN; // US-Left, US-Right
GPIO_Init(US_RIGHT_PORT, &GPIO_InitStructure);
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_Init(ADC1, &ADC_InitStructure);
}
/*******************************************************************************
* Function Name : ADC1_Reset
* Description : ADC1を初期化(Channel0から動作を開始するようにするため)
* 8CH のみ
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ADC1_Reset(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
ADC_Cmd(ADC1, DISABLE);
ADC_DMACmd(ADC1, DISABLE);
/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC1ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 4000;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA1 Channel6 Transfer Complete interrupt */
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, US_LEFT_ACH, 1, ADC_SampleTime_1Cycles5); //
ADC_RegularChannelConfig(ADC1, US_RIGHT_ACH, 2, ADC_SampleTime_1Cycles5); //
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
}
/*******************************************************************************
* Function Name : ADC1_Config
* Description : DMAを使用、ADCConvertedValue[16] へ連続してAD変換を行う
* 8CH のみ
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ADC1_Start(void)
{
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
Oct 11, 2009
Oct 10, 2009
STM32F10xライブラリ Ver3.x
STM32F10xを使うにはstMicroから提供されているライブラリが便利、
というか、周辺機能が豊富すぎてライブラリを使わないとちんぷんかんぷん。
STM32F103RBTでDMA2を初期化するとそこで暴走してしまうので
ライブラリが悪いのかと思ってライブラリVer2.1からVer3.0に乗り換えてみた。
Ver3のリリース日はVer2とそんなに離れていない割に基本的な構造は大違い。
おかげで既存のソースを対応させるのに丸一日費やしてしまった。
新しいライブラリのスタートアップコードをみていて気がついたのが
RAM容量20KまでのミドルレンジにはDMA2の割り込みベクタが記述されていない
ということはDMA2はないのね。
データシートを眺めてもクラスによる周辺機能の有無はわかりにくかったので
一生懸命、無い機能を使おうとしていたということか、
良い勉強になりました。
ライブラリVer3.0はVer2.0に較べて構成がシンプルでわかりやすいと思う。
というか、周辺機能が豊富すぎてライブラリを使わないとちんぷんかんぷん。
STM32F103RBTでDMA2を初期化するとそこで暴走してしまうので
ライブラリが悪いのかと思ってライブラリVer2.1からVer3.0に乗り換えてみた。
Ver3のリリース日はVer2とそんなに離れていない割に基本的な構造は大違い。
おかげで既存のソースを対応させるのに丸一日費やしてしまった。
新しいライブラリのスタートアップコードをみていて気がついたのが
RAM容量20KまでのミドルレンジにはDMA2の割り込みベクタが記述されていない
ということはDMA2はないのね。
データシートを眺めてもクラスによる周辺機能の有無はわかりにくかったので
一生懸命、無い機能を使おうとしていたということか、
良い勉強になりました。
ライブラリVer3.0はVer2.0に較べて構成がシンプルでわかりやすいと思う。
Oct 9, 2009
ドライブ
すっかり iPhone に嵌っている、
iPhoneで撮った写真の位置をgooglemapで表示するアプリを入手し
画面キャプチャの技を覚えた(HOME+Sleepボタン同時押し)ので
ドライブの写真をiPhoneから発送してみた。
庄原にある道の駅ゆめさくらで美味しいピザを買って、
横にある林で犬たちを遊ばせながらひとやすみ。


広島と島根の県境にあるおろちループのレストランで昼食
ここは景色が素晴らしい&舞茸そばとコーヒーが絶品。

レストランの窓から見える鉄の彫刻、
設置された当初は違和感があったんだけど
最近色が落ち着いたせいか景色になじんで良い感じ。

出雲坂根駅の近くにある水場の川でハナが水遊び


iPhoneから発送
iPhoneで撮った写真の位置をgooglemapで表示するアプリを入手し
画面キャプチャの技を覚えた(HOME+Sleepボタン同時押し)ので
ドライブの写真をiPhoneから発送してみた。
庄原にある道の駅ゆめさくらで美味しいピザを買って、
横にある林で犬たちを遊ばせながらひとやすみ。


広島と島根の県境にあるおろちループのレストランで昼食
ここは景色が素晴らしい&舞茸そばとコーヒーが絶品。

レストランの窓から見える鉄の彫刻、
設置された当初は違和感があったんだけど
最近色が落ち着いたせいか景色になじんで良い感じ。

出雲坂根駅の近くにある水場の川でハナが水遊び


iPhoneから発送
Oct 2, 2009
Subscribe to:
Comments (Atom)







