Ошибки в железе

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

Если что-то формально должно работать, но не работает, то проблема может быть не в вас.

Такое бывает относительно редко и в некоторых случаях проблему можно решить сбросом определённого регистра(ов), а в каких-то сделать ничего нельзя. По этому при разработки нового устройства, тем более если вы работаете с незнакомым микроконтроллером, рекомендуется заглядывать в документ под названием errata. В нём описываются обнаруженные ошибки, а так же приводятся инструкции того как добиться корректной работы узла, если это возможно. Аппаратные ошибки могут встречаться не только в МК, но и в универсальных процессорах12.

К сожалению, в устройстве по данному курсу таких ошибок нет, хотя с академической точки зрения это было бы через чур полезно. Однако, приведём пример.

2.1 Voltage glitch on ADC input 0

Description

A low-amplitude voltage glitch may be generated (on ADC input 0) on the PA0 pin, when the ADC is converting with injection trigger. It is generated by internal coupling and synchronized to the beginning and the end of the injection sequence, whatever the channel(s) to be converted.

The glitch amplitude is less than 150 mV with a typical duration of 10 ns...

...

Workaround

None.

Открываете документ, ищите интересующую вас периферию и читаете блок описания. В данном конкретном случае речь идёт о 0 канале АЦП, работающего на ножке PA0. Из-за внутренней ошибки при работе с этим каналом на нём образуется «глич» в 150 мВ длительностью 10 нс. Решения (раздел Workaround) для устранения данной проблемы нет. Другими словами, если вам нужно очень точно снимать показания, то нужно использовать другой канал.

Рассмотрим другой пример.

2.8.1 USART1_RTS and CAN_TX

Conditions

Description

Even if CAN_TX is not used, this signal is set by default to 1 if I/O port pin PA12 is configured as an alternate function output. In this case USART1_RTS cannot be used.

Workaround

When USART1_RTS is used, the CAN must be remapped to either another IO configuration when the CAN is used, or to the unused configuration (CAN_REMAP[1:0] set to “01”) when the CAN is not used.

В данном примере разработчик хочет использовать ножку RTS у блока USART1, но из-за внутреннего устройства, сделать это не перенеся (англ. remap) вывод TX блока CAN не может.

Подобные манипуляции могут быть намного сложнее. Откройте errata и изучите самостоятельно, например, 2.13.2 Wrong data read into data register.

Многие разработчики пренебрегают изучением документа errata, что иногда приводит к очень печальным последствиям.

Один мой хороший знакомый, как-то писал драйвер для Ethernet-чипа ENC28J60. Вот небольшая шутка от него:

Это конечно не правда, но ошибки действительно есть и их нужно учитывать.


Назад | Оглавление | Дальше

 


1 В 1994 году компания Intel выпустила процессор Pentium, в котором содержалась ошибка при выполнении инструкции FDIV (операция деления с плавающей запятой). Она приводила к некорректно результату в некоторых случаях. В результате скандала (при попытке умолчать о проблеме) Intel потеряла более половины прибыли за последний квартал 1994 года, 475 миллионов долларов.
2 Аппаратная ошибка в большинстве современных процессорах Spectre позволяет получать доступ к произвольным участкам памяти (т.е. нарушать изоляцию памяти между программами).