stm32f40xのクロックの設定は「system_stm32f4xx.c」で定義されている。
標準では、外部クロック8MHzが接続されている前提で168MHzで動作するように設定されている。
マウスでは、外部クロックではなく、内部クロック16MHzを使うので、設定を変更する必要がある。
これは普通にやると非常に面倒だ。
そこで、以下のページにあるエクセルファイルを使って自分の環境に即した「system_stm32f4xx.c」を生成する。エクセルのマクロを有効化してGenerateボタンで生成できる。
STSW-STM32091のページ
マウスの基板にマイコンを実装した。半田ブリッジがないことを目視で確認してから、電源-グランド間の抵抗値がおかしくないことを確認した。具体的には1MΩくらいあれば十分だと思う。
まだLEDを実装していないので、シリアルで通信できることが出来れば良しとする。
ちょっと反省は、プッシュスイッチと、電源用LEDが近すぎた。プログラム書き込みモードにするときに、プッシュスイッチを押しながらスライドスイッチをオンする必要があるのだけれど、プッシュスイッチを押す指でLEDが隠れてしまうのだ。それほど実害はないのだけれど、次回の課題とする。
もうひとつ。今は電源LEDの電流制限抵抗に2.2kΩを使っているのだけれど、まだ値が小さいようで少し明るい。明るいということは、電流を喰っているということなので、もう少し大きくしてもいいかもしれない。10kΩくらいかな?これは、適当にいらない基板で試してみればいいと思う。
電源周りで少し気になる点が。バッテリ駆動なので、電圧が少しずつ下がるのは仕方ないと思うけれど、レギュレータを通した後の電圧も、時間とともに低下するのだ。リポ電池の電圧は約3.8Vで、使って言うレギュレータは入出力間電圧は0.1Vの3.3V出力なので3.3Vは低下しないと思うのだけれど。
使っているレギュレータは秋月で購入したNJM2863F33。
確認したプログラムは以下。
#include "stm32f4xx.h"
#include "uart1.h"
#include "hardware.h"
//#include "main.h"
/* --------------------------------------
time : 約1uSec,1000000=1sec
clock : 168MHz
-------------------------------------- */
void delay(uint32_t time){
volatile uint32_t t;
volatile uint8_t i;
for(i=0;i<24;i++){
t = time;
while(t--);
}
}
// -------------------------------------------------------------------
// systick 割込み(1msec毎に設定してある)
// stm32f4xx_it.c で呼び出している
// -------------------------------------------------------------------
volatile uint16_t time_sec=0;
volatile uint16_t time_msec=0;
void systick_1msec(void){
static uint16_t cnt=0;
cnt++;
time_msec++;
if(cnt>1000){
time_msec=0; cnt=0; time_sec++;
}
}
void delay_ms(uint16_t msec){
uint16_t cnt=0;
cnt = time_msec;
while(msec){
if(cnt!=time_msec){
cnt = time_msec; msec--;
}
}
}
// -------------------------------------------------------
//
// -------------------------------------------------------
int main(void)
{
SystemInit();
hw_init();
uart1_init(9600);
usart1_printf("\r\n");
usart1_printf("micro mouse ver0.0.1\r\n");
usart1_printf("System Core Clock : %d \r\n",SystemCoreClock);
// systick 設定(1msec)
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
if(SysTick_Config(SystemCoreClock/1000)){
while(1); // error
}
while(1){
// SW処理
if(get_user_sw() ){ //ボタンを押したら以下を実行
set_led(LED_LEFT_INFO | LED_RIGHT_INFO); // 点灯
while(get_user_sw() ); // ボタンを放したら以下を実行
}else{
set_led(~LED_LEFT_INFO & ~LED_RIGHT_INFO); // 消灯
} // end of if
// 1秒処理
volatile static uint16_t time_tmp=0;
volatile static uint16_t adc30_max=0;
if(time_tmp!=time_sec){
time_tmp = time_sec;
usart1_printf("%4d : AD ch1=%6d , ch2=%6d , ch3=0x%6X , ch4=%6d \r",
time_sec,0,0,0,0);
adc30_max = 0;
} // end of if
} // end of while
return 0;
}

0 件のコメント:
コメントを投稿