Le X. schrieb:
> Genau, weil die Anfänger von STM machen ständig nur so Mist, die haben
> ja keine Ahnung.
Leider ist es aber so.
Also was ich beim USB Host mir RTOS erlebt habe geht auf keine Kuhaut
mehr.
(Son USB Host schreibt eben nicht mal eben selber)
Die config structs nutzen meist uint32_t oä statt enums.
Somit funktionieren keine Vorschaufunktionen von IDEs für mögliche
Werte.
Eine suche über rechtsklick "go to definition of xyz" geht so auch nicht
und man muss im Headerfile rumscrollen bis mans findet.
Weiterhin kann man so ausversehen falsche Bitmasken reinwerfen ohne,
dass der Compiler meckert (vertipper).
Netter UART/PLL Bug beim L431 im Zusammenhang mit dem GammelMX:
Im UART wird eine Baudrate falsch gesetzt, weil der APB Takt falsch
zurückgerehcnet wird.
uint32_t clk = HAL_RCC_GetPCLK2Freq(); // CLK = 31750000 statt 80000000
usartdiv = (uint16_t)(UART_DIV_SAMPLING16(clk, huart->Init.BaudRate));
Dadurch stimmt die Baudrate nicht mehr (div = 276)
Woran liegts?
1 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
2 | RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
3 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
4 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
5 | //RCC_OscInitStruct.PLL.PLLM = 1; << wird von CubeMX nicht inited und steht daher auf 0 -> HAL nimmt defaultwert von 2, aber die PLL bekommt 1 im Reg
|
6 | RCC_OscInitStruct.PLL.PLLN = 10;
|
7 | RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
|
8 | RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
|
9 | RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
|
Leider muss ich auf Arbeit den Schrott nutzen, aber somit kann ich
wenigstens Kompromat in meinem Redmine sammeln ;)