新学多照
发表于 2024-4-25 12:13:14
本帖最后由 新学多照 于 2024-4-28 15:19 编辑
打卡第二集
好学天上
发表于 2024-4-25 15:22:22
第十一-十二集 定时计数器打卡滴滴滴 好好好开始上难度了 脑子不太好使
STC32G128K芯片学习打卡贴
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7834
(出处: 国芯技术交流网站)
Rain_Personal
发表于 2024-4-25 18:09:02
跟冲哥学习STC32G128K芯片打卡持续更新 期待 实验箱的实物验证
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7996
(出处: 国芯技术交流网站)
yzk_hi
发表于 2024-4-26 08:05:48
打卡第九集
科学妞妞
发表于 2024-4-26 09:12:34
zhaoye818 发表于 2024-4-24 21:16
第十五集学习笔记:1.中断和中断系统 2.什么是外部中断 3.外部中断的用法 INT0的程序。STC的资料真的很实用 ...
确实资料好
深度陶醉
发表于 2024-4-26 10:55:36
zhaoye818 发表于 2024-4-25 19:11
客服让我发打卡链接,请问您是怎么发的?
如下图,到你的回复消息页面,将所有培训的回复载图给客服就可以了
bnnpyuvtkd
发表于 2024-4-26 11:16:46
本帖最后由 bnnpyuvtkd 于 2024-4-26 11:42 编辑
今天跳到第16讲:IO口中断
IO口中断是STC32G单片机特有的中断,是宏晶公司独创的
第16讲:IO中断
IO中断是STC32G特有的内部中断,下面编写IO中断程序。
打开示例程序第11(外部中断)的程序,主程序是Demo.c ,如下:
#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h"
#include "beep.h"
#include "tim0.h"
#include "exit.h"
#define MAIN_Fosc 24000000UL //定义主时钟
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
bitTIM_10MS_Flag; //10ms的标志位
void sys_init(); //函数声明
void delay_ms(u16 ms); //unsigned int
void main() //程序开始运行的入口
{
u8 i;
u8 KEY_NUM = 0; //保存矩阵按键的键码
u8 KEY_Str = 0; //表示当前输入了几个密码位
sys_init(); //USB功能+IO口初始化
usb_init(); //usb库初始化
Timer0_Init(); //定时器0初始化
INT0_Init(); //外部中断0初始化
EA = 1; //CPU开放中断,打开总中断。
SEG0 = 0;
SEG1 = 0;
// SEG2 = 2;
// SEG3 = 3;
// SEG4 = 4;
// SEG5 = 5;
// SEG6 = 6;
// SEG7 = 7;
LED = 0xff; //初始状态熄灭所有LED
while(1) //死循环
{
if( DeviceState != DEVSTATE_CONFIGURED ) //
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
for(i=0;i<8;i++) //循环八次
{
LED = ~(1<<i); //当前i是几,就点亮第几个LED
delay_ms(500); //验收500ms
}
if( P33 ==0 ) //如果P33按下了
SEG1 += 1; //数码管1的数值+1
}
}
void INT0_Isr(void) interrupt 0
{
SEG0 += 1; //数码管0的数值+1
}
void Timer0_Isr(void) interrupt 1
{
static timcount = 0;
SEG_LED_Show(); //数码管刷新的
timcount++; //1ms+1
if( timcount>=10 ) //如果这个变量大于等于10,10ms计数到达
{
timcount = 0;
TIM_10MS_Flag = 1; //10ms时间到了
}
}
void sys_init() //函数定义
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
P3M0 = 0x00;
P3M1 = 0x00;
P3M0 &= ~0x03;
P3M1 |= 0x03;
//设置USB使用的时钟源
IRC48MCR = 0x80; //使能内部48M高速IRC
while (!(IRC48MCR & 0x01));//等待时钟稳定
USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
}
void delay_ms(u16 ms) //unsigned int
{
u16 i;
do
{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
中断优先级的设置
编写P35口的IO中断,中断改变SEG0的数值(显示0--9),延时500ms ,观察定时器刷新数码管,数码管一个一个刷新过去,SEG0显示也会自加。
在Demo.c里编写中断函数
void P3Exit_Isr(void) interrupt 40
{
u8 intf;
intf = P3INTF; //读取状态标志,必须软件清空
if(intf)
{
P3INTF = 0; //清空中断标志位
if(intf & 0x20) //P35按下
{
SEG0++; //这边是数码管循环显示0-9
if(SEG0 > 9)
SEG0 = 0;
delay_ms(500); //这边是为了演示一个功能,大家正式写代码千万不能在中断里加延时
}
}
}
第40号大于31,而keil只能有32(0~31)个中断号,为了多运行中断号,要运行一个增加中断号的“拓展Keil的C代码中断号”软件,之后keil的中断号就扩展到了256个。
还要在tim0.c里的“void Timer0_Init(void)”函数中添加
IP = 0X02;
IPH = 0X02;
以设置最高优先级。
yzk_hi
发表于 2024-4-26 15:47:41
打卡第十集
组织小白
发表于 2024-4-26 16:52:01
已经买了屠龙刀开始学习
组织小白
发表于 2024-4-26 17:26:53
第二课看完了,实验箱图片我没有看到can接口,学完后想用板子做一个无线遥控器诊断仪