Jump to content

    

Создание проекта на assembler в STM32F4

У ТС там плата Nucleo. Светодиод у неё на PA5 висит. Кнопки на PA0-PA2 можно повесить. Тогда 95% курсовика будут вот так выглядеть. Осталось только в стартап вставить.

  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;  

  using KEY_A = PA_0;
  using KEY_B = PA_1;
  using KEY_C = PA_2;
  using LED = PA_5;

  ConfigList<PinMode::PushPull_LowSpeed<0>, LED,                 // светодиод
             PinMode::Input_PullUp, KEY_A, KEY_B, KEY_C,         // Кнопки на GND 
             PinMode::AF_PushPull_LowSpeed_PullUp<0x0>, PA_13,   // PA13=SWDIO
             PinMode::AF_PushPull_LowSpeed_PullDown<0x0>, PA_14, // PA14=SWCLK
             PinMode::Input_Floating, CfgCmd::AllUnusedPins >::pwr_config();
  LED Y;
  for(;;)
  {
    auto kyes = PinList<KEY_C, KEY_B, KEY_A>::read();
    bool A = kyes&1 ? false : true;
    bool B = kyes&2 ? false : true;
    bool C = kyes&4 ? false : true;
    Y = (!A)*C + (!B)*(!C) + A*(!C);
  }

Листинг

//RCC->AHBENR |= RCC_AHBENR_GPIOAEN;  
        LDR.N    R0,??main_0      ;; 0x40021014
        LDR      R1,[R0, #+0]
        ORR      R1,R1,#0x20000
        STR      R1,[R0, #+0]
//ConfigList<PinMode::PushPull_LowSpeed<0>, LED,                 // светодиод
//           PinMode::Input_PullUp, KEY_A, KEY_B, KEY_C,         // Кнопки на GND 
//           PinMode::AF_PushPull_LowSpeed_PullUp<0x0>, PA_13,   // PA13=SWDIO
//           PinMode::AF_PushPull_LowSpeed_PullDown<0x0>, PA_14, // PA14=SWCLK
//           PinMode::Input_Floating, CfgCmd::AllUnusedPins >::pwr_config();
        MOV      R0,#+1207959552
        LDR.N    R1,??main_0+0x4  ;; 0x28000400
        LDR.N    R2,??main_0+0x8  ;; 0x24000015
        STR      R1,[R0, #+0]
        STR      R2,[R0, #+12]
        B.N      ??main_1
//PA_5 Y;
//for(;;)
//{
//  auto kyes = PinList<PA_2, PA_1, PA_0>::read();
//  bool A = kyes&1 ? false : true;
//  bool B = kyes&2 ? false : true;
//  bool C = kyes&4 ? false : true;
//  Y = (!A)*C + (!B)*(!C) + A*(!C);
??main_2:
        LSRS     R1,R1,#+2
        AND      R1,R1,#0x1
        EOR      R1,R1,#0x1
        EOR      R2,R2,#0x1
        ANDS     R2,R1,R2
        EOR      R1,R1,#0x1
        ANDS     R1,R3,R1
        ORRS     R1,R1,R2
        ITE      EQ 
        MOVEQ    R1,#+2097152
        MOVNE    R1,#+2097184
        STR      R1,[R0, #+24]
??main_1:
        LDR      R1,[R0, #+16]
        AND      R2,R1,#0x1
        EOR      R2,R2,#0x1
        LSLS     R3,R1,#+30
        ITE      MI 
        MOVMI    R3,#+1
        MOVPL    R3,R2
        B.N      ??main_2
        DATA
??main_0:
        DATA32
        DC32     0x40021014
        DC32     0x28000400
        DC32     0x24000015

 

Share this post


Link to post
Share on other sites
6 минут назад, VladislavS сказал:

У ТС там плата Nucleo. Светодиод у неё на PA5 висит. Кнопки на PA0-PA2 можно повесить. Тогда 90% курсовика будут вот так выглядеть. Осталось только в стартап вставить.

...Вот так и появляются потом неучи с дипломом.  :wink:

Share this post


Link to post
Share on other sites
12 минут назад, VladislavS сказал:

Меньше конкуренции будет.

:biggrin:

Надеюсь, что препод тоже читает эту конфу. Тогда помогу ему с дополнительными вопросами по полученному исходнику:

1. Как модифицировать код, если нужно обеспечить его потокобезопасную работу?

2. Как модифицировать код, если нужно обеспечить атомарность чтений всех кнопок (при условии что они находятся на разных портах) и модификации Y? И как сделать это без использования запретов прерываний?

:wink:

Share this post


Link to post
Share on other sites
3 минуты назад, jcxz сказал:

Надеюсь, что препод тоже читает эту конфу.

:sarcastic:

Share this post


Link to post
Share on other sites
6 minutes ago, jcxz said:

:biggrin:

Надеюсь, что препод тоже читает эту конфу. Тогда помогу ему с дополнительными вопросами по полученному исходнику:

1. Как модифицировать код, если нужно обеспечить его потокобезопасную работу?

2. Как модифицировать код, если нужно обеспечить атомарность чтений всех кнопок (при условии что они находятся на разных портах) и модификации Y? И как сделать это без использования запретов прерываний?

:wink:

И все изменения сохоанять в базе данных (на той же Nucleo)

И что бы ещё при этом пела и танцевала народный танец Жок

Share this post


Link to post
Share on other sites

Чтобы задавать такие вопросы надо сначала этому научить. Судя по постановке задачи там этим и близко не пахнет. 

Share this post


Link to post
Share on other sites
7 минут назад, VladislavS сказал:

Чтобы задавать такие вопросы надо сначала этому научить. Судя по постановке задачи там этим и близко не пахнет. 

Нормальная постановка задачи.

Тот кто учился и что-то пытается сделать идёт с вопросами к преподу или пишет на форум "а почему здесь так, а тут не так?"

А остальные пишут по форумам "помогите ничего не понимаю".

Share this post


Link to post
Share on other sites
3 часа назад, VladislavS сказал:

Чтобы задавать такие вопросы надо сначала этому научить. Судя по постановке задачи там этим и близко не пахнет. 

Или студень накопил хвостов за весь семестр, и это задание - из начала семестра. А в конце уже дошли до многопоточности. А на защите лабораторных препод может задавать вопросы сразу по всему курсу за весь семестр.

Share this post


Link to post
Share on other sites
2 часа назад, jcxz сказал:

Или студень накопил хвостов за весь семестр, и это задание - из начала семестра

Это надо было вообще ни разу не появиться на занятиях, чтобы не знать какая у них там среда разработки.

 

На самом деле, если разберётся в том что я там "напсевдокодил" уже плюс.

Share this post


Link to post
Share on other sites

Три входных переменных ==> восемь состояний ==> сдвиг 0x5B вправо на n, где n == ABC, даст в младшем разряде значение бита Y.
Правильный "преп" от данного решения будет писать кипятком ;-)

Share this post


Link to post
Share on other sites
33 minutes ago, Obam said:

даст в младшем разряде значение бита Y.

STM32F4 слабоват для такой задачи :nea:

Share this post


Link to post
Share on other sites

Ладно, хватит глумиться. 

Ivanyshka, как вы уже поняли, здесь не любят ленивых студентов. Попробуйте разместить свое задание в разделе "предлагаю работу", но шансов мало.

1 час назад, Obam сказал:

сдвиг 0x5B вправо на n

:yahoo: еще формулу запихнуть в макрос и расчет этого значения возложить на компилятор - будет шедевр и по форме и по содержанию.

Share this post


Link to post
Share on other sites

Да, при удачном выборе пинов вообще кода с гулькин нос получается.

constexpr bool Y(const uint8_t abc)
{
  bool A = (abc&4) ? false : true;
  bool B = (abc&2) ? false : true;
  bool C = (abc&1) ? false : true;  
  return (!A)*C + (!B)*(!C) + A*(!C);
}

constexpr uint8_t CalcShiftConst()
{
  uint8_t ret=0;
  for(uint8_t i=0; i<8; i++) ret |= Y(i)<<i;
  return ret;
}

int main()
{
  RCC->AHB1ENR = RCC_AHB1ENR_GPIOAEN;
  
  using KEY_A = PA_2;
  using KEY_B = PA_1;
  using KEY_C = PA_0;
  using LED = PA_5; LED Y;
  
  ConfigList<PinMode::PushPull_LowSpeed<0>, LED,                 // светодиод
             PinMode::Input_PullUp, KEY_A, KEY_B, KEY_C,         // Кнопки на GND 
             PinMode::AF_PushPull_LowSpeed_PullUp<0x0>, PA_13,   // PA13=SWDIO
             PinMode::AF_PushPull_LowSpeed_PullDown<0x0>, PA_14, // PA14=SWCLK
             PinMode::Input_Floating, CfgCmd::AllUnusedPins >::pwr_config();
  for(;;)
  {
    auto keys = PinList<KEY_A, KEY_B, KEY_C>::read();
    Y = (CalcShiftConst() >> keys)&1;    
  }
}

Листинг

//RCC->AHB1ENR = RCC_AHB1ENR_GPIOAEN;  
        LDR.N    R1,??main_0      ;; 0x40023830
        MOVS     R0,#+1
        STR      R0,[R1, #+0]

//ConfigList<PinMode::PushPull_LowSpeed<0>, LED,                 // светодиод
//           PinMode::Input_PullUp, KEY_A, KEY_B, KEY_C,         // Кнопки на GND 
//           PinMode::AF_PushPull_LowSpeed_PullUp<0x0>, PA_13,   // PA13=SWDIO
//           PinMode::AF_PushPull_LowSpeed_PullDown<0x0>, PA_14, // PA14=SWCLK
//           PinMode::Input_Floating, CfgCmd::AllUnusedPins >::pwr_config();
        LDR.N    R0,??main_0+0x4  ;; 0x40020000
        LDR.N    R2,??main_0+0x8  ;; 0x28000400
        LDR.N    R1,??main_0+0xC  ;; 0x24000015
        STR      R2,[R0, #+0]
        STR      R1,[R0, #+12]
        MOVS     R1,#+218

//for(;;)
//{
//  auto keys = PinList<KEY_A, KEY_B, KEY_C>::read();
??main_1:
        LDR      R2,[R0, #+16]
        AND      R2,R2,#0x7
//  Y = (CalcShiftConst() >> keys)&1;    
        LSR      R3,R1,R2
        LSLS     R2,R3,#+31
        ITE      PL 
        MOVPL    R2,#+2097152
        MOVMI    R2,#+2097184
        STR      R2,[R0, #+24]
//}
        B.N      ??main_1
        DATA
??main_0:
        DATA32
        DC32     0x40023830
        DC32     0x40020000
        DC32     0x28000400
        DC32     0x24000015

 

Share this post


Link to post
Share on other sites
В 08.01.2020 в 06:58, haker_fox сказал:

Скажите, пожалуйста, а раз вам дают такие задания, разве не обучали работе с инструментарием?

 Мы все выполняли это задание на PIC в среде proteus , но я взял дополнительное задание с STM ,для решения которого ищу информацию 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now