За хардуера.
Закачам примерни блокови схеми, на евентуална такава система, която да се използва за контрол и управление и съответства на писаното до сега.
Макар да изглежда нещо голямо, че и скъпо, това не е така. Защото
първо , единственият задължителен модул е M1, и второ, както казах преди, очаква се чипчето да е стотинки, а платката ще е нещо такова
http://vikiwat.com/prehodna-platka-smd-tqfp64.htmlЗалагайки обаче идеята по начало, ще реши как и да се проектира и хардуера и софтуера на всяка една функция. Rpi-то, макар и икономично, не е чак толкова, че да работи постоянно. То ще е в спящ режим, като очаква или да го викнат – от мрежата или от USAR-а, иле да се случи някакво друго събитие. Например искаме да включим УСБ камера за охрана през нощта, и е станало време. Как се прави това? Ами примерно инсталирали сме моушън, и компресирани файлове пращаме през час на адрес. Това е пример за абсолютно независими горно и долно ниво на системата, може обаче да решим
да видим дали е слънчево, в такъв случай кой кого ше пита, не е ясно.
Дали Rpi-о M1 или обратно, зависи къде и как сме заложили измерване и сензор. Определено по лесния и точен вариант е някъде по M2,3,4 , та значи трябва някакъв протокол .Залагайки тия неща по начало ще опрости по нататък. Връзката между M1 и M2,3,4 е ширмован кабел за интернет, плюс, минус, MOSI, MISO, и остават 4 за избор на 4 модула. Ширмован кабел трябва, защото се очаква да е на открито, и светкавиците могат да правят големи бели.
Разликата, между програма за РС и за микроконтролер е, че във втория случай нямаме ОС, директно ни се налага да работим с хардуера. Управлението е включване/изключване на битове по разни регистри, описани в даташита.
STM32xxx са с огромна периферия, за която не стигат изходни крачета. Почти всичката периферия е изключена при началното стартиране, на нея не се подава и тактова честота. Идеята е да си пуснем сами каквото ни трябва, да не се консумира ненужно ток.
Нашата идея пък е точно обратната – да скрием хардуерните различия, както и функции от ниско ниво в един слой, който да е преизползваем. Обаче, вманиачаването също е лошо,
губи се представа какво се прави. Затова ще опиша повърхностно някои неща, отначало, достатъчни да дадат идея какво се случва.
Библиотеките на контролера, които дава производителя, и по принцип които в ARM широко се ползват , се използват дефинирани структури, съответстващи на хардуерни групи регистри, например за
GPIO.
Вземаме една такава
GPIO_InitTypeDef GPIO_InitStructure;
и почваме да я попълваме. Пин 1.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
честота на тактиране - най-високата
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
като изход
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
пуш -пул, и двата транзистора на изхода са включени
PIO_InitStructure.GPIO_OType = GPIO_OType_PP;
включен е вградения резистор към маса /40к/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
След като сме си я попълнили структурата, я даваме /чрез адрес/
на фунцията GPIO_Init. До този момент ние никакво действие върху хардуера не сме направили.
GPIO_Init(GPIOC, &GPIO_InitStructure);
Преди това обаче, ние трябва да пуснем честота на тоя порт, иначе няма да стане.
Има и друг подход, който ползва само дефинираните в заглавните файлове имена, и си работим директно с регистрите
включваме честота на порт С
RCC->AHBENR |= RCC_AHBPeriph_GPIOС;
Ако разровим дата шита, има регистър
AHB peripheral clock enable register (RCC_AHBENR)
Bit 19 IOPCEN: I/O port C clock enable
Set and cleared by software.
0: I/O port C clock disabled
1: I/O port C clock enabled
после в stm32f0xx_rcc.h
#define RCC_AHBPeriph_GPIOC RCC_AHBENR_GPIOCEN
после
#define RCC_AHBENR_GPIOCEN ((uint32_t)0x00080000) /*!< GPIOC clock enable */
0x00080000 е 1 в 19 бит и всичко друго нули.
RCC e указател към структура, AHBENR е регистъра, не пипаме друго, само правим OR / RCC->AHBENR |= (uint32_t)(19<<1) /
Ако пък искаме да го нулираме тоя бит инвертираме и AND.
RCC->AHBENR &= ~ RCC_AHBPeriph_GPIOС;
тия изпълнения на си изглеждат странни и мално сложни, но на практика, оптимизатора на gcc -то си ги оправя. Обаче, тия неща се срещат изключително много при инициализация, там бързодействие не трябва, а и не е нужно всеки да я знае, просто трябва да се знае, че този код прави тази инициализация, и е преизползваем.
От там на татък, знанията за хардуера са минимални,
Как и за какво ще ползваме отделните крачета си е също голяма играчка, защото повечето крачета съчетават различни алтернативни функции.
За интерфейса по SPI, М1 е master, М2,3,4 са slave. Всички те ползват
SPI 1, защото SPI 2 е опция. Както и USART2 е опция, ще е ползва USART1.
USART1 => по пин PA14/PA15 или PA9/PA10,
SPI => PA4,5,6,7 програмиране по SWD, PA13/PA14.
Или почти целия порт А е зает, 0 до 3 може за аналогови сигнали .