четверг, 15 марта 2012 г.

I & STM32-discovery part12 - reset

После старта у нас выключена почти вся периферия и работающим остается только ядро и пины портов отвечающие за отладку. Тактовый генератор приостановлен подсистемой сброса в системе сброса и тактирования - RCC (Reset and clock control). В этой статье мы подробно рассмотрим работу систему сброса.


Сброс может быть 3 видов:
  1. Системный сброс
  2. Сброс по событиям питания мк
  3. Сброс резервного домена
1) Системный сброс сбрасывает все регистры до значений по умолчанию, сбрасывает флаги контроллера тактового сигнала и регистры резервного домена. Системный сброс генерируется при:
  • Низком уровне на пине внешнего сброса - NRST
  • Событие от одного из ватчдогов
  • Программный сброс
  • Сброс по низкому уровню напряжения питания
Источник сброса может быть идентифицирован по флагам в RCC_CSR.

Программный сброс. Инициируется через SYSRESETREQ бит в SBC_AIRCR регистре. Полее подробную информацию можно почитать в соответствующей технической литературе.

Сброс по переходу в режим ожидания. Поддерживает два пути:
  1. Сброс генерируется по переходу в режим ожидания. Активен при сбросе NRST_STDBY бита в регистре пользовательских опций. При удачном переходе в режим ожидания происходит сброс.
  2. Сброс генерируется по переходу в режим останова. Активен при сбросе NRST_STOP бита в регистре пользовательских опций. При удачном переходе также генерируется сброс.
Сброс по событиям питания мк. Происходит по одному из событий:
  1. Включение/Выключение питания (POR/PDR reset).
  2. По выходу из режима ожидания. 
После сброса происходит автоматический переход мк на обработчик вектора сброса. Как видно из диаграммы схемы сброса:
 После совершения одного из событий сброса происходит генерация импульса длительностью 20 мкс, затем шина сброса возвращается в высокое логическое состояние.

Сброс резервного домена. В этом домене происходит генерация двух событий сброса:
  1. Сброс по установке триггера BDRST в контрольном регистре резерва RCC_BDCR.
  2. подача питания на Vdd или Vbat при предыдущем выключении.
На этом достаточно большая теория подошла к концу, настало время практики.

Алгоритм работы программы состоит в следующем - после запуска проверяется причина сброса и индицируется соответствующими светодиодами. Помимо сброса ч/з NRST линию присутствует программный сброс по нажатию кнопки (ч/з внешнее прерывание).

Создадим новый проект:

nis@jane ~/stm32/examples $ cp -a 06-tim3-pwm/ 07-reset
nis@jane ~/stm32/examples $ cd 07-reset/

После старта идёт анализ регистра RCC_CSR и если не произошло событий сброса то оба диода мигают если же произошел сброс то тот светодиод который отвечает за то или иное событие горит непрерывно:

/** setup CC3..4 to togle if compare */
        TIM3->CCMR2 |= TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2;
        /** setup value to compare registers 3..4 */
        if (RCC->CSR & RCC_CSR_PINRSTF) {
            TIM3->CCR3 = 1000;
            RCC->CSR &= ~RCC_CSR_PINRSTF;
        }
        else
            TIM3->CCR3 = 500;
        if (RCC->CSR & RCC_CSR_SFTRSTF) {
            TIM3->CCR4 = 1000;
            TIM3->CCR3 = 500;
            RCC->CSR &= ~RCC_CSR_SFTRSTF;
        }
        else
            TIM3->CCR4 = 500;
        RCC->CSR |= RCC_CSR_RMVF;

Для внешнего прерывания изменим обработчик так что он будет вызывать функцию программного сброса:

/* EXTI line0 interrupt */
void EXTI_L0_Handler(void) {
    if (EXTI->PR & (1 << 0)) {
        NVIC_SystemReset();
        EXTI->PR |= (1 << 0);
    }
}

Полный код проекта.
main.c:


startup.c:


Прошьем мк новым бинарным кодом:

nis@jane ~/stm32/examples/07-reset $ make all write
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F10X_MD_VL -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f100xb_flash.ld   -c -o main.o main.c
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F10X_MD_VL -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f100xb_flash.ld -o firmware.elf main.o sys_init.o startup.o -L.
arm-softfloat-linux-gnueabi-objcopy -O binary firmware.elf firmware.bin
st-flash write v1 firmware.bin 0x8000000
2012-03-15T17:10:58 INFO src/stlink-sg.c: Current mode unusable, trying to get back to a useful state...
2012-03-15T17:10:58 WARN src/stlink-sg.c: received tag 0 but expected 3
2012-03-15T17:10:58 INFO src/stlink-common.c: Loading device parameters....
2012-03-15T17:10:58 INFO src/stlink-common.c: Device connected is: F1 Medium-density Value Line device
2012-03-15T17:10:58 INFO src/stlink-common.c: SRAM size: 0x2000 bytes (8 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2012-03-15T17:10:58 INFO src/stlink-sg.c: Successfully opened a stlink v1 debugger
2012-03-15T17:10:58 INFO src/stlink-common.c: Attempting to write 728 (0x2d8) bytes to stm32 address: 134217728 (0x8000000)
2012-03-15T17:10:58 INFO src/stlink-common.c: Erasing flash page at addr: 0x8000000
2012-03-15T17:10:58 INFO src/stlink-common.c: Successfully unlocked flash
2012-03-15T17:10:58 INFO src/stlink-common.c: Finished erasing 1 pages of 1024 (0x400) bytes
2012-03-15T17:10:58 INFO src/stlink-common.c: Starting Flash write for VL core id
2012-03-15T17:10:58 INFO src/stlink-common.c: Successfully loaded flash loader in sram
2012-03-15T17:10:58 INFO src/stlink-common.c: Writing flash block 0 of size 64 (0x40)
....
2012-03-15T17:10:59 INFO src/stlink-common.c: Successfully unlocked flash
2012-03-15T17:10:59 INFO src/stlink-common.c: Writing flash block 11 of size 64 (0x40)
2012-03-15T17:10:59 INFO src/stlink-common.c: Successfully unlocked flash
2012-03-15T17:10:59 INFO src/stlink-common.c: Starting verification of write complete
2012-03-15T17:10:59 INFO src/stlink-common.c: Flash written and verified! jolly good!

И наконец видео:
Позднее мы расмотрим и другие источники сброса.