STM32勉強日記(2022/07/30):スイッチ入力
スイッチ読み込み処理
使用できそうなIC
8to3 line エンコーダー
やること。
H257とH263のキー読み込みから、キーの読み込み処理について確認する。
mbedで、キーの同時押し、押下について確認する。
キーコード作成方法を確認する。
GPIO push pullについて
レジスタ
確認 |の計算
https://gyazo.com/4b2320db733fba0100e0d18e607841d0
レジスタの考え方
GPIOポート出力データレジスタにより、GPIOの出力を設定できる。
このODR1~15のrwが1の時H、0の時Lとなる。
PAというのは、GPIOAのグループに分けられる。
PA5にアクセスする場合は、GPIOAのODR5のレジスタにアクセスし、
GPIOAのODR5が1の時はH(3.3Vを出力)、0の時はL(0Vを出力)になる。
GPIOAへのアクセス方法
GPIOA -> ODR と書くことで、GPIOAのODRにアクセスすることができる。
ODR0~15の値を変更する。
0000 0000 0000 0000
これを、ODR5をHにしたい場合は
0000 0000 0001 0000
こうなる。
その為、PA5のみを点灯させたい場合、
GPIOA -> ODR = 0b0000000000010000;
と書けば、PA5を点灯出来る。
GPIOA -> ODR = 0b0000000000011000;
だと、PA4とPA5が点灯する。
ただこのままだと、PA5をH/Lで入れ替えるのに、他のレジスタも設定することになる。
PA5だけをH/Lして、他のレジスタは考えないようにする為に、
| の演算子を使って計算する。
A = 0b0000
B = 0b0100
A |= Bとすると。
A = 0b0100になる。
それを使って
GPIOA -> ODR |= 0b0000000000010000;
でPA5が点灯する。この後に、PA5を変えずに、PA4を点灯させる場合は。
GPIOA -> ODR |= 0b0000000000001000;
とすると、PA5を変えずに、PA4のみを点灯できる。
色々な書き方
code:cs
void second(int decimal)
{
/* 変数の宣言 */
int binary = 0;
int base = 1;
/* 10進数の入力 */
// printf("10進数 = %d\n",decimal);
/* 10進数を2進数に変換 */
while(decimal>0){
binary = binary + ( decimal % 2 ) * base;
decimal = decimal / 2;
base = base * 10;
}
/* 変換した2進数の出力 */
printf(" 2進数 = %d\n", binary);
}
int main(void){
int n;
int A = 0b00000000;
n = 0x0020; /* 16進表記 */
printf("A = %d\n", A);
second(A);
printf("n = %d\n", n);
second(n);
//A|nの計算
A = A|n;
printf("A = %d\n", A);
second(A);
printf("----\n");
n=0x0010;
printf("n = %d\n", n);
second(n);
//A|nの計算
//A = A|n;
A |= n;
printf("A = %d\n", A);
second(A);
}
stm32f401xe.hを使用すると、
これらを簡単に書けるようになっている。
これが、 GPIO_ODR_OD5 だ。
これを使うと、
LED1_GPIO_Port->ODR |= GPIO_ODR_OD5; //PA5をプルアップ
とすることができる。
これは、 GPIO_ODR_OD5を検索して確認すると下記のように定義されている。
code:c
//stm32f401xe.hで定義されている。
#define GPIO_ODR_OD5 GPIO_ODR_OD5_Msk #define GPIO_ODR_OD5_Msk (0x1UL << GPIO_ODR_OD5_Pos) /*!< 0x00000020 */ 読み込みについて
読み込みはポート入力データレジスタIDRを使用する。
考え方は、基本的にODRと同じ。
GPIOA -> IDR & 0b0000000000010000;
とすると、PA5がHかLか確認できる。
ボタンが押されたときを確認したい場合
mbedにはPC13に青ボタンがあるため、
if(GPIOC -> IDR & 0b0001000000000000)
とすると、PC13の値を読み込める。
ACM1602を使う(リベンジ)
https://www.youtube.com/watch?v=ezkKVhlwk0w
全然出来ない。
マージで分からん