2 / 2 / 1
Регистрация: 05.11.2018
Сообщений: 96
1

[STM32F103C8T6, он-же Blue Pill] - SPI1, CMSIS - пример

18.03.2023, 23:48. Показов 1299. Ответов 54
Метки нет (Все метки)

Доброго времени суток, уважаемые участники форума! Подскажите пожалуйста, есть ли где готовый пример использования SPI (на CMSIS) для данного микроконтроллера? Честно, разбираться лень просто (
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2023, 23:48
Ответы с готовыми решениями:

Отладка платы STM32F103C8T6 (Blue Pill) через st-link/v2
Здравствуйте! Подскажите как отлаживать STM32F103C8T6 используя оригинальный программатор...

Подключение TFT дисплея к Arduino blue pill
Нужна помощь в подключении дисплея к Arduino blue pill. Перепробовал кучу разных библиотек. Только...

Запустить экран на ILI9341 с платой Blue Pill
Всем здравствуйте и с наступающим. Приобрел дисплей на Али, пробовал его запустить разными...

Адаптер USB-Serial с 3 UART портами на STM32 Blue Pill
Всем доброго времени суток, хотел поделиться своим проектом 3-x портового USB-Serial адаптера...

54
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
19.03.2023, 12:53 2
Цитата Сообщение от Redfern89 Посмотреть сообщение
пример использования SPI (на CMSIS) для данного микроконтроллера
ассемблер поймете ?
там в принципе только cmsis и есть... проще некуда...

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
@.CHARSET  CP1251
 
@ GNU AS
.SYNTAX   unified
.CPU      cortex-m3
.THUMB
 
.INCLUDE   "/src/inc/gpio.inc"
.INCLUDE   "/src/inc/rcc.inc"
.INCLUDE   "/src/inc/spi.inc"
 
@.DESC     name=SPI_TX_INIT type=proc
@ +----------------------------------------------------------------------+
@ |              Процедура инициализации аппаратного SPI                 |
@ +----------------------------------------------------------------------+
@ | Модуль реализует аппаратный SPI для отправки данных для любого SPI |
@ | указанного в следующих настройках:                                   |
@ |                                                                      |
.EQU  spi_interface , SPI1         @ имя используемого SPI               |
@ |  Для SPI1 используются пины: PA5  - sck,  PA7  - mosi                |
@ |  Для SPI2 используются пины: PB13 - sck,  PB15 - mosi                |
@ |                                                                      |
.equ SPI1_relocation, Да   @ переопределение пинов SPI1 на GPIO B:       |
@ |                               (PB3 - SCK,  PB5 - MOSI)               |
@ | ВНИМАНИЕ ! При переопределении пинов SPI1 на GPIOB отключается JTAG  |
@ |                                                                      |
@ +----------------------------------------------------------------------+
@ | вызов SPI_TX_INIT параметров не требует, изменяет регистры R0-R4     |
@ +----------------------------------------------------------------------+
@.ENDDESC
 
@.ITEM SPI_LIST
.EQU  SPI1               , PERIPH_BASE + SPI1_BASE  @ SPI 1 (PA5  - SCK,  PA7  - MOSI)
.EQU  SPI2               , PERIPH_BASE + SPI2_BASE  @ SPI 2 (PB13 - SCK,  PB15 - MOSI)
@.end
 
@.CONFIG spi_interface=SPI_LIST
 
@.item spi1_reloc_q
.EQU  Да            , 1     @ SPI 1 (PB3 - SCK,  PB5 - MOSI)
.EQU  Нет           , 0     @ SPI 1 (PA5 - SCK,  PA7 - MOSI)
@.end
 
@.CONFIG SPI1_relocation=spi1_reloc_q
 
.if SPI1_relocation==Нет
   .EQU  crx_sck_pin   , 5
   .EQU  crx_mosi_pin  , 7
   .EQU  gpiox         , GPIOA
   .EQU  gpio_crx      , GPIO_CRL
.ELSE
   .EQU  crx_sck_pin   , 3
   .EQU  crx_mosi_pin  , 5
   .EQU  gpiox         , GPIOB
   .EQU  gpio_crx      , GPIO_CRL
.ENDIF
 
.if spi_interface==SPI2
   .EQU  crx_sck_pin   , 13 - 8
   .EQU  crx_mosi_pin  , 15 - 8
   .EQU  gpiox         , GPIOB
   .EQU  gpio_crx      , GPIO_CRH
.ENDIF
 
.SECTION .asmcode
 
.GLOBAL   SPI_TX_INIT
SPI_TX_INIT:        @ первоначальная настройка
                    MOV        R1, 1
 
                    LDR        R2, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32
 
.if spi_interface==SPI1
        .if SPI1_relocation==Нет    @ SPI 1 без переназначения пинов
                    STR        R1, [ R2, RCC_APB2ENR_IOPAEN_N * 4 ]      @ включим gpio A
        .else
                   @ SPI 1 с переназначения пинов (на GPIO B)
                    STR        R1, [ R2, RCC_APB2ENR_IOPBEN_N * 4 ]      @ включим gpio B
                    STR        R1, [ R2, RCC_APB2ENR_AFIOEN_N * 4 ]      @ включим AFIO для ремапинга SPI1
        .endif
                    STR        R1, [ R2, RCC_APB2ENR_SPI1EN_N * 4 ]      @ включим SPI1
.else
                    @ настройки для SPI 2
                    STR        R1, [ R2, RCC_APB2ENR_IOPBEN_N * 4 ]      @ включим gpio B
                    LDR        R2, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB1ENR ) * 32
                    STR        R1, [ R2, RCC_APB1ENR_SPI2EN_N * 4 ]      @ включим SPI2
.endif
 
                    @ настройка режима работы пинов GPIO на SPI
                    LDR        R2, = gpiox
                    LDR        R4, [ R2, gpio_crx  ]    @ прочитаем состояние регистра GPIO_CRx
                    MOV        R3, GPIO_CNF_OUT_AFPP << 2 + GPIO_MODE_OUT50
                    BFI        R4, R3, crx_sck_pin * 4, 4
                    BFI        R4, R3, crx_mosi_pin * 4, 4
                    STR        R4, [ R2, gpio_crx  ]    @ сохраним измененное значение GPIO_CRx
 
.if (SPI1_relocation==Да) & (spi_interface==SPI1)   @ при релокации пинов SPI 1
                    LDR        R2, = AFIO
                    LDR        R3, [ R2, AFIO_MAPR ]
 
                    MOV        R4, AFIO_MAPR_SWJ_SWD_EN        @ отключим JTAG оставив SWD
                    BFI        R3, R4, AFIO_MAPR_SWJ_CFG_N, 3
 
                    ORR        R3, R3, AFIO_MAPR_SPI1_REMAP    @ включим ремапинг пинов SPI1
                    STR        R3, [ R2, AFIO_MAPR ]
.endif
                    @ настройка SPI
                    LDR        R2, = spi_interface
 
     @ настройки интерфейса SPI
.EQU  spi_dir        , SPI_CR1_BIDIOE                       @ Output enabled (transmit-only mode)
.EQU  spi_mode_master, SPI_CR1_MSTR | SPI_CR1_SSI           @ SPI_Mode_Master &  SSI: Internal slave select
.EQU  spi_nss        , SPI_CR1_SSM  | SPI_CR1_SPE           @ SPI_NSS_Soft    & SPI_Enable
.EQU  spi_br_presc   , SPI_CR1_BR_DIV2                      @ делитель частоты для SPI
 
                    LDR        R3, = ( spi_dir | spi_mode_master | spi_nss | spi_br_presc )
                    STR        R3, [ R2, SPI_CR1 ]
 
                    BX         LR
 
@.DESC     name=SPI_TX_SEND type=proc
@ +-----------------------------------------------------------------------+
@ |                      Процедура отправки байта по SPI                  |
@ +-----------------------------------------------------------------------+
@ | Передаваемые данные должны быть переданы в R4                         |
@ | Процедура не изменяет значения регистров                              |
@ +-----------------------------------------------------------------------+
@.ENDDESC
 
.GLOBAL   SPI_TX_SEND
SPI_TX_SEND:      @ Отправка байта по spi
                    PUSH       { R0, R1 }
 
                    LDR        R1, = spi_interface
 
                    STR        R4, [ R1, SPI_DR ]   @ отправим байт на SPI
 
SPI_TXE_WAIT:       @ проверим флаг занятости TXE
                    LDR        R0, [ R1, SPI_SR ]
                    TST        R0, SPI_SR_TXE
                    BEQ        SPI_TXE_WAIT
 
SPI_BSY_WAIT:       @ проверим флаг занятости BSY
                    LDR        R0, [ R1, SPI_SR ]
                    TST        R0, SPI_SR_BSY
                    BNE        SPI_BSY_WAIT
 
                    POP        { R0, R1 }
 
                    BX         LR
здесь отправка байта с ожиданием конца передачи

Добавлено через 6 минут
Цитата Сообщение от Redfern89 Посмотреть сообщение
Честно, разбираться лень просто
в spi кстати лучше по разбираться... там есть отличия от AVR (если раньше на них писали) - и они могут сильно попортить мозг...
хотя то что выше будет работать всегда, но указанная выше процедура отправки байта может работать значительно быстрее.

для потоковой передачи отправка должна выглядеть вот так:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.GLOBAL   SPI_TX_SEND
SPI_STREAMTX_SEND:      @ Отправка байта по spi
                    PUSH       { R0, R1 }
 
                    LDR        R1, = spi_interface
 
SPI_TXE_WAIT:       @ проверим флаг занятости TXE
                    LDR        R0, [ R1, SPI_SR ]
                    TST        R0, SPI_SR_TXE
                    BEQ        SPI_TXE_WAIT
 
                    STR        R4, [ R1, SPI_DR ]   @ отправим байт на SPI
  
                    POP        { R0, R1 }
 
                    BX         LR
0
81 / 73 / 10
Регистрация: 31.08.2022
Сообщений: 915
20.03.2023, 13:12 3
эка вы ТСа загрузили... есть готовые библиотеки и примеры....
просто он настолько ленивый, что кроме порнушных сайтов и чатов... не может открыть поисковик..
но дае если он его откроет и найдёт случайно... там мозг включать надо.... а тут - печалка...
ТС- SPI самый простой в реализации протокол....

https://microkontroller.ru/stm... blue-pill/
0
Radikal_78
20.03.2023, 19:20
  #4

Не по теме:

SergP01, может это троллинг был?)

Сам люблю на CMSIS писать, а вот к ассемблеру STM привыкнуть не могу, хотя сам давно писал на ассемблере под AVR


0
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
20.03.2023, 19:48 5
Цитата Сообщение от SergP01 Посмотреть сообщение
SPI самый простой в реализации протокол
ага, сколько ставить на то что начнет обрабатывать BSY или скорее RDY после каждой посылки или будет delay пихать куда надо и не надо ? :-)

Добавлено через 40 секунд
Цитата Сообщение от SergP01 Посмотреть сообщение
эка вы ТСа загрузили... есть готовые библиотеки и примеры....
за сутки ему никто так их и не дал :-) так что все чем мог :-)
0
3543 / 2214 / 401
Регистрация: 09.09.2017
Сообщений: 9,223
21.03.2023, 09:24 6
Вот что я изобретал недавно для дисплея st7789: SPI с возможностью DMA. Правда, изобретал я его в первую очередь для gd32vf103, а на stm'ке только первоначальное тестирование, поэтому, кажется, забыл пару багов. Правда, не помню каких.
Вложения
Тип файла: zip spi_sma_f103.zip (4.6 Кб, 5 просмотров)
0
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
21.03.2023, 09:39 7
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот что я изобретал недавно для дисплея st7789
bsy в wait ?

гм... ну если только из за дма...

p.s. кстати bsy по идее нельзя проверять без предварительной проверки txe, хотя на сях конечно все можно :-)

p.p.s. интересно, а автор на хабре бывает? а то там статья про spi была.. в котором все делают не так... как раз про stm32
0
3543 / 2214 / 401
Регистрация: 09.09.2017
Сообщений: 9,223
21.03.2023, 12:58 8
Цитата Сообщение от ВитГо Посмотреть сообщение
bsy в wait ?
Разумеется. А как иначе? Не по TXE же.
Цитата Сообщение от ВитГо Посмотреть сообщение
p.s. кстати bsy по идее нельзя проверять без предварительной проверки txe
Есть пример кода / железа, где без этого ломается?
Цитата Сообщение от ВитГо Посмотреть сообщение
p.p.s. интересно, а автор на хабре бывает? а то там статья про spi была..
Там много статей. В том числе по SPI или STM32 тоже много статей.
0
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
21.03.2023, 17:10 9
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Разумеется. А как иначе? Не по TXE же.
ну да, ну да.. я вообще там txe не обнаружил... хотя может плохо смотрел...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Есть пример кода / железа, где без этого ломается?
на ассемблере легко... а вот на си возможно только на малых скоростях spi (оверкод большой)
0
81 / 73 / 10
Регистрация: 31.08.2022
Сообщений: 915
21.03.2023, 17:20 10
Цитата Сообщение от ВитГо Посмотреть сообщение
а вот на си возможно только на малых скоростях sp
да ладна.... современные компиляторы генерят нормальный код... можете проверить.

Добавлено через 5 минут
и меня программный spi ограничивался скоростью переключения копыт... с аппаратным вообще проблем нет...
0
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
21.03.2023, 17:34 11
Цитата Сообщение от SergP01 Посмотреть сообщение
да ладна.... современные компиляторы генерят нормальный код... можете проверить.
давайте не будем, а ? я на асме пишу... последний раз говнокод кидали вчера утром.. из под куба.. понять не могли нах.я поркуа такой код сгенерен...
ActionScript 3
1
2
3
4
800b972:  4603        mov  r3, r0
 800b974:  b2db        uxtb  r3, r3
 800b976:  f003 0303   and.w  r3, r3, #3
 800b97a:  2b00        cmp  r3, #0
если вы не можете ужать этот код вдвое (!) (я то ужму в четверо (!) ) то без комментариев...
так что не надо писать про эффективность трансляции с си - вы все равно в асме ничего не понимаете, так что не делайте оценок (не ваше это.. и не надо показывать свою некомпетентность, тем более вы пишите на си, а не на асме, и он вам нафиг не нужен же был)

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

Цитата Сообщение от SergP01 Посмотреть сообщение
с аппаратным вообще проблем нет...
ну можно везде использовать bsy и проблем не будет :-) как и максимальной скорости :-)

Добавлено через 7 минут
вот делал себе зарубку про txe - bsy https://vk.com/wall-200545792_81
кстати в документации это указано, но на си никогда проблем небыло (всегда использовал макс. скорость спи)...
а вот на асме....
0
81 / 73 / 10
Регистрация: 31.08.2022
Сообщений: 915
21.03.2023, 18:15 12
Цитата Сообщение от ВитГо Посмотреть сообщение
ну можно везде использовать bsy и проблем не будет
если МК вытянет.... я помню ацп на 5 мбит прокачал.... а оно могло 10
0
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
21.03.2023, 18:18 13
Цитата Сообщение от SergP01 Посмотреть сообщение
если МК вытянет...
вы похоже до сих пор не поняли о чем речь..

ладно, не важно, не всем же писать код для быстрого обмена... кому то и управление spi аналогично тому как это сделано в avr божий дар...

Добавлено через 51 секунду
про ассемблер смотрю вы уже "проехали" ?

и правильно !!! и не пишите больше того чего не знаете...
0
81 / 73 / 10
Регистрация: 31.08.2022
Сообщений: 915
21.03.2023, 18:33 14
Цитата Сообщение от ВитГо Посмотреть сообщение
про ассемблер смотрю вы уже "проехали" ?
вот так на асм для ADSP2191 выглядит функция sin(a)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CalcSin:
//AX1 is the input: 0->0, 0x4000->pi/2, 0x7FFF->pi, 0xC000-> -pi/2
//AR is the output in 1.15 format
//uses AX1,AY1,AR,AF,MR,SR
    AF=pass 0x4000;    
    AR=AX1,AF=AX1 and AF;
    if ne AR=-AX1;
    AR=AR and 0x7FFF;
    SR=AR*AR(rnd);
    AY1=0x3240;
    MR=AR*AY1(ss);
    AY1=0x53;
    MR=MR+SR1*AY1(ss);
    SR=AR*SR1(rnd);
    AY1=0xAACC;
    MR=MR+SR1*AY1(ss);
    SR=AR*SR1(rnd);
    AY1=0x8B7;
    MR=MR+SR1*AY1(ss);
    SR=AR*SR1(rnd);
    AY1=0x1CCE;
    MR=MR+SR1*AY1(ss);
    SR=ashift MR1 by 3 (hi);
    SR=SR or lshift MR0 by 3 (lo);
    AR=pass SR1;
    if lt AR=pass 0x7FFF;
    //rts (db);
      AF=pass AX1;
      if lt AR=-AR;
      rts;
CalcSin.end:
я проверил дизасм...
копия...
только если я токое писать буду ... мне о регистрах надо голову ломать...
0
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
21.03.2023, 18:47 15
Цитата Сообщение от SergP01 Посмотреть сообщение
я проверил дизасм...
потому что это стандартная функция... макрос готовый...
это как раз и было написано человеком или оптимизировано им :-)

а вы посмотрите обычный код...

я выше вам показал что куб на генерил.. оно конечно, видать там uint8 тип был.... но как не крути, вместо этих 4х инструкций достаточно было бы одной ands r3, r0, 3

НО, я уже давно заметил что си компилятор не использует (или использует очень редко):
- битбандинг (достаточно посмотреть какая дичь обычно в настройке тактирования или включении периферии)
- условное исполнение инструкций
- использование суффикса S при проверке на ноль...

такое ощущение что макросы си написаны для cortex-m0....

так что говорить об эффективности генерируемого кода си компилятором - очень, очень, очень самоуверенно
и оверкода там дофига...причем часто тупого как в примере выше...

и я не начинаю холивар против си... у него много своих достоинств, но не надо рассказывать сказки о том чего там нет... здесь не рекламная доска для лозунгов...
0
81 / 73 / 10
Регистрация: 31.08.2022
Сообщений: 915
21.03.2023, 18:59 16
Цитата Сообщение от ВитГо Посмотреть сообщение
такое ощущение что макросы си написаны для cortex-m0
значит обленились.... только обёртки красивые пишут.... а IDE с каждым годом всё тяжелее становятся
0
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
21.03.2023, 21:29 17
Цитата Сообщение от SergP01 Посмотреть сообщение
только обёртки красивые пишут.... а IDE с каждым годом всё тяжелее становятся
главное маркетинг работает.. остальное ненужная суета на которую никто не заморачивается...
0
3543 / 2214 / 401
Регистрация: 09.09.2017
Сообщений: 9,223
22.03.2023, 10:18 18
Цитата Сообщение от ВитГо Посмотреть сообщение
ну да, ну да.. я вообще там txe не обнаружил... хотя может плохо смотрел...
Там - где?
Цитата Сообщение от ВитГо Посмотреть сообщение
на ассемблере легко... а вот на си возможно только на малых скоростях spi (оверкод большой)
Не понял. Там же не ST-HAL, а чистая работа с регистрами, на ассемблере плюс-минус пару тактов выиграете, не больше.
А проверял я от минимальной до максимальной скорости, от 72/256 до 72/2, все работает.
Наверняка есть небольшая задержка между отдельными байтами в "ручном" режиме, но чтобы от нее избавиться, пришлось бы городить вторую задержку, именно по TXE, а это усложнение, которое никакого реального прироста не даст. На малых объемах выигрыш, очевидно, также мал. А на больших включаем DMA и не страдаем ногодрыгом.
А, ну и почему нельзя всегда использовать TXE: для дисплея важно дергать линию DC между посылками, а не в середине передачи. Туда же изменение настроек SPI вроде размера слова, отключение, или там DMA.
Но я спрашивал при каких условиях мой код сломается. Не будет работать на 3% хуже теоретического предела, а перестанет работать совсем.
Цитата Сообщение от ВитГо Посмотреть сообщение
последний раз говнокод кидали вчера утром.. из под куба..
Да из-под Куба-то понятно что говнокод прилетит, это можно даже в дизасм не заглядывать.
Цитата Сообщение от ВитГо Посмотреть сообщение
если вы не можете ужать этот код вдвое
Бесполезное упражнение, поскольку мы не знаем что этот код должен делать по задумке.
Цитата Сообщение от ВитГо Посмотреть сообщение
так что не надо писать про эффективность трансляции с си - вы все равно в асме ничего не понимаете
Абсолютно напрасная самоуверенность. Я, например, при написании части кода сверялся с тем, во что он разворачивается (а макросы у меня такие, что компилятор вправе их разворачивать по-разному, и это проблема). А при работе с периферией через регистры у компилятора напротив свободы оптимизации крайне мало.
Цитата Сообщение от ВитГо Посмотреть сообщение
ну можно везде использовать bsy и проблем не будет :-) как и максимальной скорости :-)
Чушь. Через DMA оно работает всяко быстрее, чем при ручной записи в DR хотя бы потому что ядро может еще что-то делать.
А оптимизировать полторы микросекунды при инициализации или операции, которая возникает примерно раз в вечность, ценой потери читаемости никакого смысла нет.
Цитата Сообщение от ВитГо Посмотреть сообщение
вот делал себе зарубку про txe - bsy https://vk.com/wall-200545792_81
но решил вот на ассемблере подключить ST7735
Ага, с моим st7789 похожая ерунда была. У него какой-то противоестественный режим SPI используется. У меня было еще веселее. На частоте 1:2 работает, а на 1:64 уже нет. А когда поигрался с CPOL / PHASE, заработало нормально. Ну и на 108/2, если я правильно помню, все-таки не справляется, пришлось 108/4 делать (это на GD'шке, у нее максималка повыше, чем у ST).
Цитата Сообщение от ВитГо Посмотреть сообщение
- битбандинг (достаточно посмотреть какая дичь обычно в настройке тактирования или включении периферии)
Вы бы оценили на сколько процентов битбанд и прочие извращения в инициализации ускоряют программу, которая работает хотя бы пару часов. Впрочем, подскажу: примерно нинасколько, потому что выполняется единственный раз.
Цитата Сообщение от ВитГо Посмотреть сообщение
НО, я уже давно заметил что си компилятор не использует (или использует очень редко):
Хм, даже интересно. Компиляторов Си ведь несколько. Они все себя так ведут?
Цитата Сообщение от ВитГо Посмотреть сообщение
и я не начинаю холивар против си... у него много своих достоинств
...основные из которых - читаемость и переносимость исходного кода. При портировании с stm32f103 (ARM) на gd32vf103 (RISC-V) мне пришлось по сути только пробежаться по рафманам и переименовать регистры, благо по периферии они почти совместимы. На ассемблере бы так просто не было.
1
74 / 65 / 12
Регистрация: 09.02.2016
Сообщений: 880
Записей в блоге: 16
22.03.2023, 11:09 19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Там - где?
в вашем архиве...
там две процедуры bsy и wait в обоих используется bsy :-)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не понял. Там же не ST-HAL, а чистая работа с регистрами, на ассемблере плюс-минус пару тактов выиграете, не больше.
А проверял я от минимальной до максимальной скорости, от 72/256 до 72/2, все работает.
Наверняка есть небольшая задержка между отдельными байтами в "ручном" режиме, но чтобы от нее избавиться, пришлось бы городить вторую задержку, именно по TXE, а это усложнение, которое никакого реального прироста не даст.
использование txe дает прирост !!! как минимум на 1 такт при передаче потока каждый передаваемый байт (полуслово)..
в принципе для дисплеев - согласен, не даст, так как обычно команды состоят из одного байта...

а вот если на дисплей не буфер сбрасывают через dma, а например выполняется позиционирование, то есть идет последовательность:
команда_дисплея: POS_X
данные LO_X
данные HI_X
команда_дисплея: POS_Y
данные LO_Y
данные HI_Y

то вы уже потеряли два такта SPI (1\4 байта).. возможно на risc-v этого нет, с ними не знаком (только планирую)

если использовать bsy - то конечно будет работать :-) я разве сказал что не будет ?!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Да из-под Куба-то понятно что говнокод прилетит, это можно даже в дизасм не заглядывать.
ну да, ну да, под другими средами gcc другой :-) охотно верю :-) я еще и в зубных фей верю.. и в деда мороза :-)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Бесполезное упражнение, поскольку мы не знаем что этот код должен делать по задумке.
там более чем понятно что код делает... и более чем понятно как из 4 инструкций сделать одну...
но конечно понятно тому кто знаком с асмом реально, а не пишет каждый раз что СИ генерит афигенно оптимальный код (ни разу не посмотрев что же на самом деле он генерит)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чушь. Через DMA оно работает всяко быстрее, чем при ручной записи в DR хотя бы потому что ядро может еще что-то делать.
скорость отправки данных от дма не зависит.
подготовка да- с дма возможно параллельно... но никакого отношения это к скорости spi не имеет

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ага, с моим st7789 похожая ерунда была. У него какой-то противоестественный режим SPI используется. У меня было еще веселее. На частоте 1:2 работает, а на 1:64 уже нет. А когда поигрался с CPOL / PHASE, заработало нормально. Ну и на 108/2, если я правильно помню, все-таки не справляется, пришлось 108/4 делать (это на GD'шке, у нее максималка повыше, чем у ST)
хз.. у меня 7789 нормально запустился... но на stm.. там да, частота меньше... а вы в итоге какие фазы выставили ?! не по даташиту ?!
а на частоте 1:64 может просто слишком маленькая частота ? у меня был какой то дисплей который отказывался при частоте spi меньше 1 мгц работать... правда там вообще извращенный интерфейс spi был...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы бы оценили на сколько процентов битбанд и прочие извращения в инициализации ускоряют программу, которая работает хотя бы пару часов. Впрочем, подскажу: примерно нинасколько, потому что выполняется единственный раз.
а кто вам сказал что битбанд только при инициализации ?
в этом и проблема компилятора.. он готов городить чтение\модификацию\запись одного бита вместо того чтобы просто использовать битбандинг :-)
об этом я и говорю...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Хм, даже интересно. Компиляторов Си ведь несколько. Они все себя так ведут?
вот и мне интересно.. теперь когда будут присылать вопросы буду требовать точного указания среды \ компилятора \ опций компиляции...

компилятор си хорошо какой нить логически\математический байт процессинг в логике программы реализует.. действительно выжимает все и там практически нечего оптимизировать

но как доходит очередь до работы с типами данных, записью бит\битовых полей в регистры\память, вызовы подпрограмм - то там ужас ужас ужас...

Добавлено через 5 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
...основные из которых - читаемость и переносимость исходного кода. При портировании с stm32f103 (ARM) на gd32vf103 (RISC-V) мне пришлось по сути только пробежаться по рафманам и переименовать регистры, благо по периферии они почти совместимы. На ассемблере бы так просто не было.
на ассемблере все тоже самое.. вы просто не пробовали :-)

реально программа точно так же бьется на блоки... и только блоки periph и например core приходится править...
вся остальная логика программы остается неизменной..
проблемы могут начаться только если вы с m4 например на m3 захотите мигрировать, и в коде под m4 какие нить dsp инструкции использовали (которых в m3 просто нет) - но как то такую миграцию (а главное ее цели) я плохо представляю
а вот миграция вверх - вообще без проблем !
0
81 / 73 / 10
Регистрация: 31.08.2022
Сообщений: 915
22.03.2023, 11:22 20
Цитата Сообщение от ВитГо Посмотреть сообщение
а кто вам сказал что битбанд только при инициализации ?
в этом и проблема компилятора.. он готов городить чтение\модификацию\запись одного бита вместо того чтобы просто использовать битбандинг :-)
об этом я и говорю...
вот только не каждая железка такое умеет...
и как бы вы там в асм не писали - взвести бит - получите чтение\модификацию\запись

Добавлено через 2 минуты
поэтому ногодрыги такие тормозные
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2023, 11:22
Помогаю со студенческими работами здесь

STM32 Blue Pill, не могу заставить таймер заткнуться, пока нажата кнопка
Здравствуйте, уважаемые форумчане! Помогите пожалуйста разобраться с проблемой, не пойму, что не...

[noob mode] Выкидывать ли эту испорченную Black pill?
Здравствуйте попробовал ардуино, прочитал пару книг. Все понятно. Но без отладки неудобно....

STM32L151+SPI1
Столкнулся с проблемой работы stm32l1 +mcp3201 Инициализация #define SPI_MCP3201_CS1_LOW() ...

помогите с SPI1 на STM32F103
вот код настройки SPI в мастере: void SPIConfig(void) { SPI1-&gt;CR1 |= SPI_CR1_CPOL | ...

stm32f4 из SPI1 в SPI2
Пытаюсь расчехлить spi. Ткните носом в толковое описание... Вот что накатано: /* * spi2: *...

GD32F207 проблемы с настройкой SPI1
Пытаюсь запустить обмен по SPI1 (если считать от 0, как в документации на MCU) с Flash (25-й). ...

[Решено] STM32F105, SPI1, VS1053
Привет всем. Пытаюсь соорудить плеер на STM32F105 и VS1053. С частотами проца разобрался вроде,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru