Решил я значит помигать светодиодом
Смотрю example_sources/gpio, там все просто как грабли. Пишу в точности как в примере собираю, заливаю... ноги не шевелятся, более того если смотреть отладчиком регистры gpio в них нули и не записывается даже если писать в регистр через gdb / openocd.
Код:
Судя по тому что в регистры не пишется даже отладчиком подумал что не включено тактирование gpio.
Добавил в начале программы
Теперь в регистры портов начали записываться данные, но сигнала на ножке так и не появилось. Составил таблицу для всех выводов RL-00:
Имеется три класса результатов:
1) работает
2) не работает но если писать напрямую в регистры то работает. это потому что gpio_init выдает ложную ошибку и не настраивает DDR
3) никак не работает, даже если писать в DDR и DR. предположительно включен неправильный pin mux.
Выводы:
* gpio_init не настраивает pin mux в режим gpio
* HAL содержит ошибки и ругается на пины которые могли бы работать
* gpio api перетяжелено, распределение портов бредовое
* jtag похоже занимает весь порт E
* если нужен spi0 на порту C то работоспособных gpio почти не остается
Вопрос:
как настроить pin mux на режим gpio ?
Смотрю example_sources/gpio, там все просто как грабли. Пишу в точности как в примере собираю, заливаю... ноги не шевелятся, более того если смотреть отладчиком регистры gpio в них нули и не записывается даже если писать в регистр через gdb / openocd.
Код:
Код:
#include "device.h"
#include "diag.h"
#include "main.h"
#include "gpio_api.h" // mbed
void main(void)
{
gpio_t gpio_test;
PinName pin = PC_5;
int i;
gpio_init(&gpio_test, pin);
gpio_dir(&gpio_test, PIN_OUTPUT); // Direction: Output
gpio_mode(&gpio_test, PullNone); // No pull
while (1)
{
DiagPrintf("hal_pin.pin_name=%d : \t", gpio_test.hal_pin.pin_name);
gpio_write(&gpio_test, 0);
DiagPrintf("0\t");
gpio_write(&gpio_test, 1);
DiagPrintf("1\n");
}
Добавил в начале программы
Код:
ACTCK_GPIO_CCTRL(ON);
SLPCK_GPIO_CCTRL(ON);
HAL_PERI_ON_WRITE32(REG_GPIO_SHTDN_CTRL, 0x7FF);
GPIO_FCTRL(ON);
Код:
PORT | RESULT | hal_pin.pin_name | PORT, Mask | direct write to DR, DDR
PA_0 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(0) Unavailable | name = 0 | PORTA_DR=0x00000001 | dbg-nok
PA_1 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(1) Unavailable | name = 1 | PORTA_DR=0x00000002 | dbg-nok
PA_2 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(2) Unavailable | name = 32 | PORTB_DR=0x00000001 | dbg-nok
PA_3 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(3) Unavailable | name = 33 | PORTB_DR=0x00000002 | dbg-ok
PA_4 | nok (output = high) | name = 34 | PORTB_DR=0x00000004 | dbg-nok
PA_5 | ok | name = 35 | PORTB_DR=0x00000008
PC_0 | ok | name = 42 | PORTB_DR=0x00000400
PC_1 | ok | name = 6 | PORTA_DR=0x00000040
PC_2 | ok | name = 43 | PORTB_DR=0x00000800
PC_3 | ok | name = 7 | PORTA_DR=0x00000080
PC_4 | ok | name = 8 | PORTA_DR=0x00000100
PC_5 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(25) Unavailable | name = 9 | PORTA_DR=0x00000200 | dbg-ok
PE_1 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(41) Unavailable | name = 21 | PORTA_DR=0x00200000 | dbg-nok
PE_2 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(42) Unavailable | name = 22 | PORTA_DR=0x00400000 | dbg-nok
PE_3 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(43) Unavailable | name = 23 | PORTA_DR=0x00800000 | dbg-nok
1) работает
2) не работает но если писать напрямую в регистры то работает. это потому что gpio_init выдает ложную ошибку и не настраивает DDR
3) никак не работает, даже если писать в DDR и DR. предположительно включен неправильный pin mux.
Выводы:
* gpio_init не настраивает pin mux в режим gpio
* HAL содержит ошибки и ругается на пины которые могли бы работать
* gpio api перетяжелено, распределение портов бредовое
* jtag похоже занимает весь порт E
* если нужен spi0 на порту C то работоспособных gpio почти не остается
Вопрос:
как настроить pin mux на режим gpio ?