Hi.Sorry my English, "google" style :)Found bugs in the Cortex M0, M3, M4 series controllers STMicroelectronics brand. I’m a hobbyist, so far I’m only using chips from this company.I ask the question here because the bug appears in the handler mode, not in thread mode, and because I have already asked the question of the st-community and received such an answer:"What is wrong about it? What should it do instead, and why?" :) :)For STM32VLDISCOVERY board with stm32f100RB chip assembler code is:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;STM32VLDISCOVERY board ;Clock: HSI 8MHz ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GET ../inc/stm32f100x.asm Stack_Size * 0x00000400 AREA Stack,NOINIT,READWRITE Stack_Mem % Stack_Size __initial_sp AREA Reset,CODE,READONLY EXPORT __Vectors __Vectors & __initial_sp & Reset_Handler & NMI_Handler_ & HardFault_Handler_ & MemManage_Handler_ & BusFault_Handler_ & UsageFault_Handler_ & 0 & 0 & 0 & 0 & SVC_Handler_ & DebugMon_Handler_ & 0 & PendSV_Handler_ & SysTick_Handler_ & WWDG_IRQ_ ;1 #0x00 #0x00 & PVD_IRQ_ ;2 #0x01 & TAMPER_IRQ_ ;4 #0x02 & RTC_IRQ_ ;8 #0x03 & FLASH_IRQ_ ;16 #0x04 & RCC_IRQ_ ;32 #0x05 & EXTI0_IRQ_ ;64 #0x06 & EXTI1_IRQ_ ;128 #0x07 & EXTI2_IRQ_ ;1 #0x01 #0x08 & EXTI3_IRQ_ ;2 #0x09 & EXTI4_IRQ_ ;4 #0x0A & DMA1_Channel1_IRQ_ ;8 #0x0B & DMA1_Channel2_IRQ_ ;16 #0x0C & DMA1_Channel3_IRQ_ ;32 #0x0D & DMA1_Channel4_IRQ_ ;64 #0x0E & DMA1_Channel5_IRQ_ ;128 #0x0F & DMA1_Channel6_IRQ_ ;1 #0x02 #0x10 & DMA1_Channel7_IRQ_ ;2 #0x11 & ADC1_IRQ_ ;4 #0x12 & 0 & 0 & 0 & 0 & EXTI9_5_IRQ_ ;128 #0x17 & TIM1_BRK_TIM15_IRQ_ ;1 #0x03 #0x18 & TIM1_UP_TIM16_IRQ_ ;2 #0x19 & TIM1_TRG_COM_TIM17_IRQ_ ;4 #0x1A & TIM1_CC_IRQ_ ;8 #0x1B & TIM2_IRQ_ ;16 #0x1C & TIM3_IRQ_ ;32 #0x1D & TIM4_IRQ_ ;64 #0x1E & I2C1_EV_IRQ_ ;128 #0x1F & I2C1_ER_IRQ_ ;1 #0x04 #0x20 & I2C2_EV_IRQ_ ;2 #0x21 & I2C2_ER_IRQ_ ;4 #0x22 & SPI1_IRQ_ ;8 #0x23 & SPI2_IRQ_ ;16 #0x24 & USART1_IRQ_ ;32 #0x25 & USART2_IRQ_ ;64 #0x26 & USART3_IRQ_ ;128 #0x27 & EXTI15_10_IRQ_ ;1 #0x05 #0x28 & RTCAlarm_IRQ_ ;2 #0x29 & CEC_IRQ_ ;4 #0x2A & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & TIM6_DAC_IRQ_ ;64 #0x06 #0x36 & TIM7_IRQ_ ;128 #0x37 ALIGN AREA SysInit,CODE,READONLY ENTRY GLOBAL Reset_Handler Reset_Handler PROC cpsid i movs r11,#1 movs r10,#0 ;Enable port A,B,C, USART1 USART2 USART3 ldr r0,=RCC_CR movw r1,#0x401C strh r1,[r0,#0x18] movs r1,#2_110 strb r1,[r0,#0x1E] ;Change APB2 prescaler in range 1...16 movs r1,#2_00101000 strb r1,[r0,#0x05] ;Pin PC9 as OUT in Push-Pull 2 MHz mode mov32 r0,#GPIOC_CRH mov32 r1,#0x44444424 str r1,[r0] ;;PA9:10 as TX:RX USART1 ;ldr r0,=GPIOA_CRH ;ldr r1,=0x88844AA4 ;str r1,[r0] ;;USART1 ;ldr r0,=USART1_SR ;movw r1,#0x2000 ;strh r1,[r0,#0x0C] ;USART enable в CR1 ;movw r1,#0xFFF0 ;341 ;strh r1,[r0,#0x08] ;BRR ;ldr r0,=a_USART1_TE ;str r11,[r0] ;;PA2:3 as TX:RX USART2 ;ldr r0,=GPIOA_CRL ;ldr r1,=0x4444AA44 ;str r1,[r0] ;;USART2 ;ldr r0,=USART2_SR ;movw r1,#0x2000 ;strh r1,[r0,#0x0C] ;USART enable в CR1 ;movw r1,#0x341 ;strh r1,[r0,#0x08] ;BRR ;ldr r0,=a_USART2_TE ;str r11,[r0] ;PB10:11 as TX:RX USART3 ldr r0,=GPIOB_CRH ldr r1,=0x4444AA44 str r1,[r0] ;USART3 ldr r0,=USART3_SR movw r1,#0x2000 strh r1,[r0,#0x0C] ;USART enable в CR1 movw r1,#0x0341 strh r1,[r0,#0x08] ;baud rate 9.6KBps ldr r0,=a_USART3_TE str r11,[r0] ;Configure external interrupt on rising edge pin A0 ldr r0,=NVIC_ISER0 movs r3,#64 strb r3,[r0] ldr r0,=EXTI_IMR str r11,[r0] str r11,[r0,#0x08] cpsie i ;;Thread mode ;ldr r3,=GPIOA_IDR ;waitePress_A0 ;ldr r1,[r3] ;lsls r1,#31 ;BEQ waitePress_A0 ;ldr r0,=USART3_DR ;movs r1,#'R' ;strh r1,[r0] ;send 'R' on USART3 ;ldr r0,=GPIOC_BSRR ;;;;;;;;;;;;;;;;;;;;;;;; ;movw r1,#0x200 ; ;str r1,[r0] ; ;mov32 r2,#0x7A1200 ; LED on pin C9 is lit ;ledC9_ON ; ;subs r2,#1 ; withing 3 seconds ;BNE ledC9_ON ; ***************** ;lsl r1,#16 ; ;str r1,[r0] ;;;;;;;;;;;;;;;;;;;;;;;; ;B waitePress_A0 B . ALIGN ENDP ;Handler mode EXTI0_IRQ_ PROC cpsid i ldr r0,=USART3_DR movs r1,#'J' strh r1,[r0] ldr r0,=GPIOC_BSRR ;;;;;;;;;;;;;;;;;;;;;;;; movw r1,#0x200 ; str r1,[r0] ; mov32 r2,#0x7A1200 ; LED on pin C9 is lit LEDloop ; subs r2,#1 ; withing ????? seconds BNE LEDloop ; ********************* lsl r1,#16 ; str r1,[r0] ;;;;;;;;;;;;;;;;;;;;;;;; ldr r0,=a_EXTI_PR0 str r11,[r0] ;clear interrapt flag in EXTI_PR0 cpsie i ldr r12,[SP,#0x14] BX LR ALIGN ENDP NMI_Handler_ PROC B . ENDP HardFault_Handler_ PROC B . ENDP MemManage_Handler_ PROC B . ENDP BusFault_Handler_ PROC B . ENDP UsageFault_Handler_ PROC B . ENDP SVC_Handler_ PROC B . ENDP DebugMon_Handler_ PROC B . ENDP PendSV_Handler_ PROC B . ENDP SysTick_Handler_ PROC B . ENDP defolt_handler_ PROC WWDG_IRQ_ PVD_IRQ_ TAMPER_IRQ_ RTC_IRQ_ FLASH_IRQ_ RCC_IRQ_ ;EXTI0_IRQ_ EXTI1_IRQ_ EXTI2_IRQ_ EXTI3_IRQ_ EXTI4_IRQ_ DMA1_Channel1_IRQ_ DMA1_Channel2_IRQ_ DMA1_Channel3_IRQ_ DMA1_Channel4_IRQ_ DMA1_Channel5_IRQ_ DMA1_Channel6_IRQ_ DMA1_Channel7_IRQ_ ADC1_IRQ_ EXTI9_5_IRQ_ TIM1_BRK_TIM15_IRQ_ TIM1_UP_TIM16_IRQ_ TIM1_TRG_COM_TIM17_IRQ_ TIM1_CC_IRQ_ TIM2_IRQ_ TIM3_IRQ_ TIM4_IRQ_ I2C1_EV_IRQ_ I2C1_ER_IRQ_ I2C2_EV_IRQ_ I2C2_ER_IRQ_ SPI1_IRQ_ SPI2_IRQ_ USART1_IRQ_ USART2_IRQ_ USART3_IRQ_ EXTI15_10_IRQ_ RTCAlarm_IRQ_ CEC_IRQ_ TIM6_DAC_IRQ_ TIM7_IRQ_ B . ALIGN ENDP END
In the tread mode code block:
mov32 r2,#0x7A1200 ; LED on pin C9 is lit ledC9_ON ; subs r2,#1 ; withing 3 seconds BNE ledC9_ON ; *****************
runs in 3 sec. USART does not have abnormal behavior.
In handler mode, external interrupt EXTI0, also it's ok if APB2 prescaler is 0 or 2. BUT if APB2 prescaler is 4 or higher the mentioned above code runs in 6 sec and USART, in one byte mode, sents byte TWICE.I found these bugs on chip stm32f100RB rev Z, stm32f030f4 rev A, stm32f051C8 rev B. But two last chips, cortex-M0 arc run code for 4 second in thread mode.
Chip stm32f303VC rev Y (STM32F3DISCOVERY board) has little different behavior. It's bugs appear for all value APB2 prescaler.
СПС
Алексей_Калинов said:STMicroelectronics brand
Then you need to be reporting that to ST - not to ARM!
Алексей_Калинов said:I have already asked the question of the st-community and received such an answer:"What is wrong about it? What should it do instead, and why?" :) :)
Those are perfectly valid responses and to be expected
http://www.catb.org/esr/faqs/smart-questions.html#idm368