Пт янв 13, 2023 07:51:25
Пт янв 13, 2023 09:48:20
Сб янв 14, 2023 16:48:52
typedef struct{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t weekday;
uint8_t day;
uint8_t month;
uint8_t year;
} rtc_t;
static uint8_t div10b(uint8_t i, uint8_t *r){ // divide by 10
uint32_t u = i;
u *= 52429;
u >>= 19;
if(r) *r = i - 10*u;
return (uint8_t)u;
}
static uint8_t DEC2BCD(uint8_t x){
uint8_t d, r;
d = div10b(x, &r);
return (d << 4 | r);
}
int rtc_setdate(rtc_t *d){
if(d->year > 99) return FALSE;
if(d->month > 12 || d->month == 0) return FALSE;
if(d->day > maxdays[d->month - 1] || d->day == 0) return FALSE;
if(d->month == 2 && d->day == 29){
uint8_t test = (d->year >> 2) << 2;
if(d->year != test) return FALSE; // not leap year
}
if(d->weekday > 7 || d->weekday == 0) return FALSE;
RTC->ICSR |= RTC_ICSR_INIT;
WAITWHILE(!(RTC->ICSR & RTC_ICSR_INITF));
RTC->DR = DEC2BCD(d->year) << RTC_DR_YU_Pos | d->weekday << RTC_DR_WDU_Pos | DEC2BCD(d->month) << RTC_DR_MU_Pos | DEC2BCD(d->day) << RTC_DR_DU_Pos;
RTC->ICSR &= ~RTC_ICSR_INIT;
return TRUE;
}
int rtc_settime(rtc_t *t){
if(t->hour > 23) return FALSE;
if(t->minute > 59) return FALSE;
if(t->second > 59) return FALSE;
RTC->ICSR |= RTC_ICSR_INIT;
WAITWHILE(!(RTC->ICSR & RTC_ICSR_INITF));
RTC->TR = DEC2BCD(t->hour) << RTC_TR_HU_Pos | DEC2BCD(t->minute) << RTC_TR_MNU_Pos | DEC2BCD(t->second) << RTC_TR_SU_Pos;
RTC->ICSR &= ~RTC_ICSR_INIT;
return TRUE;
}
void get_curtime(rtc_t *t){
WAITWHILE(!(RTC->ICSR & RTC_ICSR_RSF));
register uint32_t r = RTC->TR;
#define BCDu(shift) ((r >> shift) & 0xf)
t->second = BCDu(RTC_TR_SU_Pos) + 10 * BCDu(RTC_TR_ST_Pos);
t->minute = BCDu(RTC_TR_MNU_Pos) + 10 * BCDu(RTC_TR_MNT_Pos);
t->hour = BCDu(RTC_TR_HU_Pos) + 10 * BCDu(RTC_TR_HT_Pos);
r = RTC->DR;
t->day = BCDu(RTC_DR_DU_Pos) + 10 * BCDu(RTC_DR_DT_Pos);
t->month = BCDu(RTC_DR_MU_Pos);
if(r & RTC_DR_MT) t->month += 10;
t->weekday = (r >> RTC_DR_WDU_Pos) & 0x7;
t->year = BCDu(RTC_DR_YU_Pos) + 10 * BCDu(RTC_DR_YT_Pos);
}
int rtc_setcalib(int calval){
if(calval < -511 || calval > 512) return FALSE;
uint32_t calp = 0, calm = 0;
if(calval < 0) calm = -calval;
else if(calval > 0){
calp = RTC_CALR_CALP;
calm = 512 - calval;
}
// unlock RCC
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
RTC->CALR = calp | calm;
return 1;
}
int rtc_getcalib(){
int calval = (RTC->CALR & RTC_CALR_CALP) ? 512 : 0;
calval -= RTC->CALR & 0x1ff;
return calval;
}
static const char *weekdays[] = {"Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"};
static const char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"};
static void prezero(uint8_t x){
if(x < 10){ putch('0'); putch('0' + x);}
else USND(u2str(x));
}
void print_curtime(){
rtc_t t;
get_curtime(&t);
USND(weekdays[t.weekday - 1]);
putch(' ');
USND(months[t.month - 1]);
putch(' ');
USND(u2str(t.day));
putch(' ');
prezero(t.hour);
putch(':');
prezero(t.minute);
putch(':');
prezero(t.second);
USND(" 20"); prezero(t.year);
putch('\n');
}
Сб янв 14, 2023 16:54:25
Сб янв 14, 2023 16:59:09
Сб янв 14, 2023 17:46:14
Сб янв 14, 2023 17:54:58
Сб янв 14, 2023 17:58:05
Сб янв 14, 2023 18:03:09
Сб янв 14, 2023 18:05:09
Сб янв 14, 2023 18:23:32
Сб янв 14, 2023 18:40:21
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
GPIOC->CRH |= GPIO_CRH_CNF8_1 | GPIO_CRH_CNF9_1;
GPIOC->CRH &= ~(GPIO_CRH_CNF8_0 | GPIO_CRH_CNF9_0);
GPIOC->CRH &= ~(GPIO_CRH_MODE8_1 | GPIO_CRH_MODE9_1);
GPIOC->CRH |= GPIO_CRH_MODE8_0 | GPIO_CRH_MODE9_0;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->CR1 = 0;
TIM3->PSC = 0;
TIM3->ARR = 0;
TIM3->CCR3 = 0;
TIM3->CCR4 = 0;
TIM3->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1;
TIM3->CCMR2 |= TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1;
TIM3->CCER = TIM_CCER_CC3E | TIM_CCER_CC4E;
TIM3->CR1 |= TIM_CR1_CEN;
TIM3->CCR3 ^= 1; // 7 тактов
TIM3->CCR3 = 1; // 2 такта
TIM3->CCR3 = 0; // 2 такта
Сб янв 14, 2023 19:05:04
Сб янв 14, 2023 19:06:29
Сб янв 14, 2023 19:13:49
Меня интересует что будет при единице?MLX90640 писал(а):При 0 в регистре сравнения иголок на выходе не возникает
А как надо?VladislavS писал(а):Хоть и отвратительно написано.
Сб янв 14, 2023 19:47:20
Сб янв 14, 2023 19:51:47
Это хорошо когда флеша 128 К, а вот когда всего 16 К, стоит задуматься.ARV писал(а):а блинк на 5к за 5 минут, имхо, лучше, чем блинк в 0.5к за 20 лет...
Сб янв 14, 2023 19:56:26
Сб янв 14, 2023 20:03:01
Сб янв 14, 2023 20:07:40