Stm32

From Chalmers Robotförening
Revision as of 21:33, 5 November 2013 by Sterna (talk | contribs)

Här samlas information om STM32, t.ex. processorer, info om biblioteket, lite vanliga misstag man gör osv. Mer info finns på STs hemsida


Programmering

Som alla vet programmerar man i C.

Det funkar inte!

Om du setat länge med ett problem finns det några standardmisstag om man brukar göra. Kolla igenom följande checklista så kanske du hittar ditt problem:

Har du givit klocka till peripheral?

Alla peripherals måste ha klocka. Det första man bör gör när man initar någonting peripheral är att anropa funktionen RCC_APBxPeriphClockCmd(RCC_APBxPeriph_PPPPP,ENABLE) där x är den buss din peripheral sitter på och RCC_APBxPeriph_PPPPP är makrot för den peripheral du ska slå igång. Det finns även för RCC_AHB-bussen också. GPIO sitter på APB2 exempelvis. Notera att alla moduler som är inblandade ska ha klocka. Exempelvis om du ska göra PWM så måste du ge klocka både till GPIO, GPIO_AF och timern.

Är du säker på att det är rätt pinne? Har du skrivit rätt Port-namn i koden?

Har du kopplat alternate function till pinnen?

AF till pinnen kopplas med funktionen GPIO_PinAFConfig(GPIO_PORT,GPIO_PinSource,GPIO_AF). Info finns i filen GPIO.c.

Har du kört din init-funktion?

Nej, det har du inte. Kolla igen.

Har du enablat din peripheral?

Detta gör man med Periph_CMD(Enable) (t.ex. TIM_Cmd(TIMx,ENABLE), SPI_Cmd(SPIx,ENABLE) eller USART_Cmd(USARTx,ENABLE)).

Min PWM funkar inte!

Notera att för vissa timers (TIM1, TIM8, TIM15-17 på STM32F1xx och endast TIM1,8 på F4) så måste man anropa en extra funktion som sätter igång PWM. Detta görs med funktionen TIM_CtrlPWMOutputs(TIMx,ENABLE). Denna funktion kan också användas för att stänga av PWM på pinnen (vilket kan vara smidigt ibland)

Min pinne funkar inte!

Är din pinne PB3, PB4, PA13, PA14 eller PA15? Detta är JTAG/SWD-pinnarna och dom är som standard denna funktion och INTE GPIO. Dessa måste remappas innan dom kan användas som GPIO. Detta görs med funktionen GPIO_PinRemapConfig(GPIO_Remap_SWJ_xxx,ENABLE), där xxx finns som följande options: NoJRST som låser upp PB4, JTAGDisable som låser upp PB3, PB4 och PA15 samt Disable som låser upp alla pinnar (ja, det ser skumt ut när man anropar GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE), men det är korrekt). Notera att på STM32F4xx så finns det ingen remap alls. Detta sköts enbart via AF-controllern.

Logikanalysator

Denna är helt ovärderlig vid felsökning av kommunikationsprotokoll. Om du setat mer än 5 minuter med ditt problem med UART/SPI så hämta logikanalysatorn och koppla upp den. Det tar inte många minuter och löser oftast ditt problem. Den är mycket enkelt att få igång. Mer info finns här. Annars är oscilloskopet din vän. Samma där, det tar inte lång tid att ta fram och sätta upp det.

Peripheralexempel

Med i libbet kommer det massa exempel som är ganska bra och tar upp det mesta. Här följer några skräddassydda och bättre förklarade exempel.

GPIO

Med interrupt

Timer

PWM

UART

Modeller

Det finns massa olika modeller.


Länkar

Vart hittar man datablad? Vart hittar man libbet? Vart köper man dom?