Я новичок в STR 9, а также в программировании микроконтроллеров. Может ли кто-нибудь объяснить значение этих строк в примере с блинком. У меня проблемы с пониманием этого. Спасибо
Я хочу мигать только одним светодиодом за раз, скажем, светодиодом № 4. Как мне это сделать?
int main (void) {
unsigned int i, n;
unsigned short AD_old, AD_value;
/* ADC Setup */
SCU->GPIOIN[4] |= 0x01; /* P4.0 input - mode 0 */
SCU->GPIOOUT[4] &= 0xFFFC; /* P4.0 output - mode 0 */
GPIO4->DDR &= 0xFE; /* P4.0 direction - input */
SCU->GPIOANA |= 0x0001; /* P4.0 analog mode ON */
ADC->CR |= 0x0002; /* Set POR bit */
for (n = 0; n < 100000; n ++); /* Wait > 1 ms (at 96 MHz) */
ADC->CR &= 0xFFF7; /* Clear STB bit */
for (n = 0; n < 1500; n ++); /* Wait > 15 us (at 96 MHz) */
ADC->CR |= 0x0400; /* Enable end of conversion interupt*/
ADC->CCR = 0x0003; /* AD Conversion, No WDG on Ch 0 */
SCU->GPIOOUT[7] = 0x5555; /* P7.0..7 output - mode 1 */
GPIO7->DDR = 0xFF; /* P7.0..7 Outputs (LED Data) */
/* LCD Setup */
GPIO8->DDR = 0xFF; /* P8.0..7 Outputs (LCD Data) */
GPIO9->DDR = 0x07; /* P9.0..2 Outputs (LCD Control) */
lcd_init();
lcd_clear();
lcd_print (" MCB-LAB ");
set_cursor (0, 1);
lcd_print (" biomed ");
for (i = 0; i < 200; i++) wait(); /* Wait for initial display */
/* Configure and enable IRQ for A/D Converter (ADC) */
VIC0->VAiR[15] = (unsigned int)ADC_IRQ_Handler; /* Setup ADC IRQ Hndl addr */
VIC0->VCiR[15] |= 0x20; /* Enable the vector interrupt */
VIC0->VCiR[15] |= 15; /* Specify the interrupt number */
VIC0->INTER |= (1<<15); /* Enable ADC interrupt */
/* Configure and enable IRQ for Timer (TIM3) */
VIC0->VAiR[7] = (unsigned int)TIM3_IRQ_Handler;/* Setup TIM3 IRQ Hndl addr*/
VIC0->VCiR[7] |= 0x20; /* Enable the vector interrupt */
VIC0->VCiR[7] |= 7; /* Specify the interrupt number */
VIC0->INTER |= (1<<7); /* Enable TIM3 interrupt */
/* Timer 3 Configuration (TIM3) */
TIM3->CNTR = 0x0000; /* Setup TIM3 counter register */
TIM3->CR2 &= 0xFF00; /* Clear prescaler value */
TIM3->CR2 |= 0x000F; /* Setup TIM3 prescaler */
TIM3->CR2 |= 0x2000; /* TIM3 timer overflow intrupt en */
TIM3->CR1 |= 0x8000; /* TIM3 counter enable */
while (1) { /* Loop forever */
for (n = 0x01; n <= 0xFF; n <<= 1) {
GPIO7->DR[0x3FC] = n; /* Turn on LED */
wait(); /* Delay */
AD_value = AD_last; /* Read AD_last value */
if (AD_value != AD_last) /* Make sure that AD interrupt did */
AD_value = AD_last; /* not interfere with value reading */
AD_value /= 13; /* Scale to AD_Value to 0 - 78 */
if (AD_old != AD_value) { /* If AD value has changed */
set_cursor (0, 1);
AD_old = AD_value;
for (i = 0; i < 16; i++) { /* Disp bargraph according to AD */
if (AD_value > 5) {
lcd_putchar (0x05);
AD_value -= 5;
} else {
lcd_putchar (AD_value);
AD_value = 0;
}
}
}
}
}
}
Прежде всего, удалите все, что не связано с миганием светодиода.
int main (void) {
SCU->GPIOOUT[7] = 0x5555; /* P7.0..7 output - mode 1 */
GPIO7->DDR = 0xFF; /* P7.0..7 Outputs (LED Data) */
while (1) { /* Loop forever */
for (n = 0x01; n <= 0xFF; n <<= 1) {
GPIO7->DR[0x3FC] = n; /* Turn on LED */
}
}
Даташит не смотрел, но могу предположить, что:
SCU->GPIOOUT
устанавливает функцию контактов на GPIO. GPIO7->DDR
устанавливает выводы на выходы (Регистр направления данных) GPIO7->DR
устанавливает данные для вывода.
Следующим шагом будет просмотр этих регистров в документации и проверка их точного назначения.
Семейство микроконтроллеров STR91x имеет очень гибкие периферийные устройства. К сожалению, эта гибкость делает их несколько сложными в настройке. Я предлагаю начать с загрузки библиотеки прошивки STR91xFA с сайта ST.com . После того, как вы подключили библиотеку к своему проекту, вам нужно сделать что-то похожее на следующее, чтобы настроить порт 7 (при условии, что ваши светодиоды подключены к порту 7) в качестве выходных контактов общего назначения:
void InitGPIO7( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO7 clock */
SCU_APBPeriphClockConfig(__GPIO7, ENABLE);
/* Initialize the GPIO port */
GPIO_DeInit(GPIO7);
/* Configure port 7 pins as general purpose output */
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1;
GPIO_Init (GPIO7, &GPIO_InitStructure);
}
После того, как порт настроен, вы можете использовать библиотечную функцию
GPIO_Write(...); /* see documentation for parameters */
для записи во все 8 бит одновременно или
GPIO_WriteBit(...); /* see documentation for parameters */
для записи по одному биту за раз.
Обратите внимание, что это непроверенный код.
АндреяКо
The first thing is to remove all of the stuff unrelated to flashing the LED.
семай